0

在我的 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 部分,请问有什么建议吗?

4

1 回答 1

1

就像在 上应用减和一样简单result

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变量,它分配了用于执行并行区域的实际线程数。赋值被放入一个SINGLE构造中,因为它足以让一个线程 - 无论是哪个线程 - 来执行赋值。

于 2013-10-21T18:29:57.843 回答