OPENMP在线程上运行相同的工作

时间:2013-10-21 16:16:32

标签: 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)+...
sum = sum/(number of threads)

我只需要在OPENMP内部向所有线程发送do循环,而不是阻止此循环。 我可以使用MPI和MPI_reduce做我想做的事,但我想写一个混合代码OPENMP + MPI。我还没有想出OPENMP部分,所以建议吗?

1 个答案:

答案 0 :(得分: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构造中,因为它只需要一个线程 - 而不管是哪一个 - 来执行赋值。