Multithreading OPENMP在线程上运行相同的作业

Multithreading OPENMP在线程上运行相同的作业,multithreading,openmp,Multithreading,Openmp,在我的OPENMP代码中,我希望所有线程都做相同的工作,并在最后取平均值(基本上是计算错误)。(我如何计算错误?每个线程生成不同的随机数,因此每个线程的结果不同。) 下面是简单的代码 program ... .. !$OMP PARALLEL do i=1,Nstep !.... some code goes here result=... end do !$END PARALLEL sum = result(from thread 0)+result(from thread 1)+..

在我的OPENMP代码中,我希望所有线程都做相同的工作,并在最后取平均值(基本上是计算错误)。(我如何计算错误?每个线程生成不同的随机数,因此每个线程的结果不同。)

下面是简单的代码

program ... 

..
!$OMP PARALLEL
do i=1,Nstep
!.... some code goes here
result=...


end do
!$END PARALLEL
sum = result(from thread 0)+result(from thread 1)+...
sum = sum/(number of threads)
简单地说,我必须将OPENMP中的do循环发送到所有线程,而不是阻塞该循环。
我可以使用MPI和MPI_reduce做我想做的事情,但我想写一个混合代码OPENMP+MPI。我还没有弄清楚OPENMP部分,所以请提供建议?

这很简单,只需对
结果应用求和缩减即可:

USE omp_lib   ! for omp_get_num_threads()
INTEGER :: num_threads

result = 0.0
num_threads = 1

!$OMP PARALLEL REDUCTION(+:result)
!$OMP SINGLE
num_threads = omp_get_num_threads()
!$OMP END SINGLE
do i = 1, Nstep
...
result = ...
...
end do
!$END PARALLEL
result = result / num_threads
这里的
num_threads
是一个共享的
INTEGER
变量,它被分配用于执行并行区域的实际线程数。分配被放在一个
单个
构造中,因为它满足一个线程(无论是哪个线程)来执行分配