fortran - Openmp:在并行内部有一个 MASTER 构造
问题描述
我有一个看起来像这样的 fortran 代码
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed)
do ix = 1,nx
! Do parallel work
do iy = 1,ny
! Do a lot of work....
!$OMP ATOMIC
numberOfCalculationsPerformed = numberOfCalculationsPerformed+1
!$OMP END ATOMIC
!$OMP MASTER
! Report progress
call progressCallBack(numberOfCalculationsPerformed/totalNCalculations)
!$OMP END MASTER
end do
end do
当我尝试编译它报告
错误 #7102:在 DO、PARALLEL DO、SECTIONS、PARALLEL SECTIONS 或 SINGLE 指令的动态范围中不允许使用 OpenMP* MASTER 指令。
我不明白。我试图将并行 do 构造修改为此
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed), &
!$OMP& SCHEDULE(STATIC)
(认为它与调度有关)但这并没有改变错误。有谁知道我做错了什么?是不可能在构造master
内部使用parallel do
还是什么?如果是这样,是否有替代方案?
编辑:
!$OMP SINGLE
!$OMP END SINGLE
而不是MASTER
等效的产生相同的结果...(错误消息)
附言。我只需要其中一个线程来执行progressCallback
。
解决方案
这个问题有点老了,但由于我最近偶然发现了同样的问题,我想分享一个简单的解决方案。这个想法是制定一个 if 子句,它只对其中一个线程评估为 TRUE。这可以通过查询当前线程号轻松实现。通过要求它为零,可以保证该子句对于至少一个线程是正确的:
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed)
do ix = 1,nx
! Do parallel work
do iy = 1,ny
! Do a lot of work....
!$OMP ATOMIC
numberOfCalculationsPerformed = numberOfCalculationsPerformed+1
!$OMP END ATOMIC
if (OMP_GET_THREAD_NUM() == 0) then
! Report progress
call progressCallBack(numberOfCalculationsPerformed/totalNCalculations)
end if
end do
end do
推荐阅读
- javascript - 如何将js变量添加到表单中?
- excel - Excel - 如何根据三个字段(过滤器)计算列
- c++ - 在具有 3v3 电源的芯片上检测来自 2v5 src 的数字输入?
- android - 我无法在 Android Studio 中访问“TextView”或“Button”
- azure - 如何在 node.js 中使用“@azure/ms-rest-nodeauth”获取 Azure 凭据?
- .net - 无法在 Azure 中找到 .NET 5
- python - 服务总线 CBS 身份验证已过期
- java - python列表与Java数组有何不同
- objective-c - 在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果
- c# - C# 使用 system.net.FtpClient 连接显式 FTP - 证书错误