同样的长度循环保证在OpenMP线程之间以相同的方式分离

时间:2016-10-21 13:39:16

标签: multithreading openmp

我的问题很简单,但我无法找到要搜索答案的字词。

如果我这样做:

const unsigned N = ... ;
#pragma omp parallel
{
   unsigned i;
   #pragma omp for
   for(i=0; i<N; i++) // first loop
      <1st stuffs>

   <stuffs with other omp for...>

   #pragma omp for
   for(i=0; i<N; i++) // second loop
      <3rd stuffs>
}

第一个和第二个循环是否保证在线程之间以相同的方式分开?

如果没有,是否还有明确定义块大小或使用schedule子句的可能性?

2 个答案:

答案 0 :(得分:3)

如果满足某些条件,则为是(OpenMP规范,第2.7.1节循环结构):

  

static时间表的合规实施必须确保这一点   将使用相同的线程逻辑迭代次数分配   如果满足以下条件,则在两个循环区域中:1)两个循环   区域具有相同数量的循环迭代,2)两个循环区域   具有相同的 chunk_size 值,或者两个循环区域都没有   指定了 chunk_size ,3)两个循环区域绑定到同一个并行区域,并且4)两个循环都没有与SIMD结构相关联。

示例中的代码满足所有四个条件,但您必须显式指定静态调度,因为OpenMP规范会保留默认的循环调度类型(即没有schedule子句时的类型目前)具体实施。

以下代码是完全符合的示例:

#pragma omp parallel
{
   #pragma omp for schedule(static)
   for(i=0; i<N; i++) // first loop
      <1st stuffs>

   <other stuff>

   #pragma omp for schedule(static)
   for(i=0; i<N; i++) // second loop
      <3rd stuffs>
}

答案 1 :(得分:1)

根据这个答案https://stackoverflow.com/a/10852852/7024081,假设# threadsN未更改,并且调度设置为{{1},则两个循环中的线程确实将被分配相同的迭代范围}。

如果您无法将计划设置为静态,我不确定会发生什么,因为默认计划将取决于实施:https://computing.llnl.gov/tutorials/openMP/#DO