OpenMP如何处理嵌套循环?

时间:2012-11-13 07:42:06

标签: c++ loops parallel-processing openmp

以下代码是仅仅并行化第一个(外部)循环,还是并行化整个嵌套循环?

    #pragma omp parallel for
    for (int i=0;i<N;i++)
    { 
      for (int j=0;j<M;j++)
      {
       //do task(i,j)//
      }
    }

我只是想确定上面的代码是否会并行化整个嵌套的for循环(因此一个线程直接相关的任务(i,j)),或者它只是并行化外部for循环(因此它确保了,对于具有循环索引i的每个并行线程,其内部循环将在单个线程中顺序完成,这非常重要)。

2 个答案:

答案 0 :(得分:39)

您编写的行将仅与外部循环并行化。要并行化两者,您需要添加collapse子句:

#pragma omp parallel for collapse(2)
    for (int i=0;i<N;i++)
    { 
      for (int j=0;j<M;j++)
      {
       //do task(i,j)//
      }
    }

您可能需要查看OpenMP 3.1规范(第2.5.1节)以获取更多详细信息。

答案 1 :(得分:4)

OpenMP仅并行化pragma旁边的循环。如果需要,您也可以并行化内部循环,但不会自动完成。