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

Posted

技术标签:

【中文标题】OPENMP 在线程上运行相同的作业【英文标题】:OPENMP running the same job on threads 【发布时间】:2013-10-21 16:16:31 【问题描述】:

在我的 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】:

就像在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 构造中,因为它足以让一个线程(无论是哪个线程)来执行分配。

【讨论】:

以上是关于OPENMP 在线程上运行相同的作业的主要内容,如果未能解决你的问题,请参考以下文章

确保混合 MPI / OpenMP 在不同的内核上运行每个 OpenMP 线程

在不同的线程下运行相同的代码有啥意义 - openMP?

如何确定 Java 线程在哪个内核上运行?

OpenMP 线程计数问题

Play Framework 1.2.4 在异步线程中同步作业:可能吗?

如何防止相同类型的两个管道 jenkins 作业在同一节点上并行运行?