Это можно улучшить, исправив некоторые ошибки OpenMP. Во-первых, поскольку вы суммируете (копии) count
во всех параллельных потоках, вам необходимо применить оператор сокращения в конце параллельного сегмента, чтобы объединить все эти значения обратно в одно значение. Кроме того, переменные i
, x
, y
и z
должны иметь отдельные экземпляры для каждого параллельного потока - вам не нужно, чтобы потоки использовали один и тот же! Чтобы указать все это, ваша директива #pragma
в верхней части цикла должна быть:
#pragma omp parallel for private(i, x, y, z) reduction(+:count)
Кроме того, область действия этого цикла - for
, поэтому вам больше ничего не нужно делать; после выхода из цикла автоматически произойдет синхронизация потоков. (И эта синхронизация необходима, чтобы count
содержал все приращения из всех потоков!) В частности, ваши прагмы task
и barrier
не имеют смысла, так как в этот момент вы вернулись только к одному потоку - кроме того, нет смысла помещать эти вычисления в параллельное задание.
И еще одна проблема, которая возникла в связи с вероятной медлительностью и / или плохой случайностью системного генератора случайных чисел в этих случаях. Вы, вероятно, захотите изучить особенности этого в вашей системе и дать ему новое случайное начальное число в каждом потоке или использовать другой генератор случайных чисел в зависимости от того, что вы найдете.
Кроме того, это выглядит довольно разумно. Ничего другого вы не можете сделать с этим алгоритмом, поскольку он короткий и тривиально распараллеливаемый.