【发布时间】:2015-09-16 10:42:18
【问题描述】:
我不明白为什么 !$OMP DO 实际上是将任务分配给不同的线程,但使用 openMP 内部函数 OMP_GET_THREAD_NUM() 无法检测到。
program test
implicit none
integer :: i,su
double precision a(10), b(10),c
INTEGER OMP_GET_THREAD_NUM
su=0
!$OMP DO
do i=1,10
b(i) = 10*i;
c = b(i);
write(*,*)'in the loop, rank =',c,OMP_GET_THREAD_NUM()
enddo
!$OMP END DO
!$OMP PARALLEL
write(*,*) 'Rank = ',OMP_GET_THREAD_NUM()
!$OMP END PARALLEL
end
结果是:
in the loop, rank = 10.000000000000000 0
in the loop, rank = 20.000000000000000 0
in the loop, rank = 30.000000000000000 0
in the loop, rank = 40.000000000000000 0
in the loop, rank = 50.000000000000000 0
in the loop, rank = 60.000000000000000 0
in the loop, rank = 70.000000000000000 0
in the loop, rank = 80.000000000000000 0
in the loop, rank = 90.000000000000000 0
in the loop, rank = 100.00000000000000 0
Rank = 0
Rank = 6
Rank = 1
Rank = 7
Rank = 2
Rank = 5
Rank = 4
Rank = 3
看到了吗?在 DO-LOOP 中,公众似乎只能看到 Master 线程。这是不公平的,因为这不是他唯一的一项贡献。
【问题讨论】:
-
!$OMP DO-- 看起来你忘了实例化一个并行区域。试试!$OMP PARALLEL DO -
谢谢!我得到了它!我被网站上的 F95 手册误导了。它包含了很多我觉得分散的东西。所以我认为 !$OMP PARALLEL DO 等于首先 !$OMP PARALLEL 然后下一行: !$OMP DO 。对吗?