Я пытаюсь сделать быстрый параллельный цикл.На каждой итерации цикла я создаю массив, который стоит дорого, поэтому я хочу, чтобы он распределялся по многим потокам.После того, как массив построен, я использую его для обновления матрицы.Здесь это становится сложным, потому что матрица является общей для всех потоков, поэтому только один поток может изменять части матрицы одновременно, но когда я работаю над матрицей, оказывается, что я тоже могу распределять эту работу, так как могу работать над разными частями.матрицы в одно и то же время.
Вот что я сейчас делаю:
#pragma omp parallel for
for (i = 0; i < n; ++i)
{
... build array bi ...
#pragma omp critical
{
update_matrix(A, bi)
}
}
...
subroutine update_matrix(A, b)
{
printf("id0 = %d\n", omp_get_thread_num());
#pragma omp parallel sections
{
#pragma omp section
{
printf("id1 = %d\n", omp_get_thread_num());
modify columns 1 to j of A using b
}
#pragma omp section
{
printf("id2 = %d\n", omp_get_thread_num());
modify columns j+1 to k of A using b
}
}
}
Проблема в том, что два разных раздела процедуры update_matrix () не распараллеливаются.Вывод, который я получаю, выглядит следующим образом:
id0 = 19
id1 = 0
id2 = 0
id0 = 5
id1 = 0
id2 = 0
...
Таким образом, два раздела выполняются одним потоком (0).Я попытался удалить критический элемент #pragma в основном цикле, но он дает тот же результат.Кто-нибудь знает, что я делаю не так?