以下代码是仅仅并行化第一个(外部)循环,还是并行化整个嵌套循环?
#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的每个并行线程,其内部循环将在单个线程中顺序完成,这非常重要)。
答案 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旁边的循环。如果需要,您也可以并行化内部循环,但不会自动完成。