我试图了解OPENMP中的嵌套DO循环。有很多关于此的论坛,但我没有找到以下问题的答案。
让我们考虑两种情况。问题将在代码
之下案例a)
!$OMP PARALLEL DO
DO i = 1,N
DO j = 1,M
...code...
END DO
END DO
案例b)
!$OMP PARALLEL DO
DO i = 1,N
!$OMP PARALLEL DO
DO j = 1,M
... code ...
END DO
END DO
Question
。我不确定以下陈述是否正确
在情况(a)中,第一个循环将由线程共享,例如线程1在<1> 10之间具有 i ,线程2具有 i 11到20之间,依此类推。但是这里的每个线程都有1到M之间的 j 值,不是吗,或者第二个循环也会在所有线程之间分叉,如第一个?
如果(b)线程1的值 i 介于1和10之间, j 介于10和20之间(而不是整个范围) 。
这是模式的工作原理吗?如果我没有表达自己的想法并且问题不清楚,我很抱歉。
答案 0 :(得分:3)
仅当启用了OpenMP中的nested parallelism时,第二个版本才有所不同。如果是,那么它会进行另一个级别划分。如果未启用,则会被忽略。
您无法说明线程如何精确划分索引,因为您未指定SCHEDULE
且默认值未指定。但通常默认值实现为static
,索引范围均匀分配。
第一个parallel do
在具有某些值i
的线程组之间划分工作,另一个将j
的值除以这些组中的各个线程。