OPENMP中的嵌套DO循环

时间:2013-12-25 18:30:44

标签: fortran openmp

我试图了解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。我不确定以下陈述是否正确

  1. 在情况(a)中,第一个循环将由线程共享,例如线程1在<1> 10之间具有 i ,线程2具有 i 11到20之间,依此类推。但是这里的每个线程都有1到M之间的 j 值,不是吗,或者第二个循环也会在所有线程之间分叉,如第一个?

  2. 如果(b)线程1的值 i 介于1和10之间, j 介于10和20之间(而不是整个范围) 。

  3. 这是模式的工作原理吗?如果我没有表达自己的想法并且问题不清楚,我很抱歉。

1 个答案:

答案 0 :(得分:3)

仅当启用了OpenMP中的nested parallelism时,第二个版本才有所不同。如果是,那么它会进行另一个级别划分。如果未启用,则会被忽略。

您无法说明线程如何精确划分索引,因为您未指定SCHEDULE且默认值未指定。但通常默认值实现为static,索引范围均匀分配。

第一个parallel do在具有某些值i的线程组之间划分工作,另一个将j的值除以这些组中的各个线程。