在下面的代码中,我试图并行化一个打印二维数组的嵌套循环。我经历了教程,发现我必须使用崩溃条款:
#include<stdio.h>
#include<omp.h>
int main(){
//int i = 10;
int grid[3][3];
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
grid[i][j] = i+j;
}
}
int i, j;
#pragma omp parallel for collapse(2)
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
printf("%d\t", grid[i][j]);
}
printf("\n");
}
return 0;
}
问题是我收到的错误是C3005: 'collapse' : unexpected token encountered on OpenMP 'parallel for' directive
。
注意:在我使用折叠之前,我只使用了#pragma omp parallel for
,结果不正确:
0 1 2 4
1
1
崩溃是正确的解决方案,以产生正确的结果?如果是这样,为什么我会收到上述错误?
答案 0 :(得分:0)
如果您折叠循环,结果不一定按您想要的顺序排序。 例如,如果我替换
printf("%d\t", grid[i][j]);
与
printf("%d %d\n", i, j);
你会明白为什么你不会打印出有序网格。总的来说,我会说并行终端输出是一个坏主意,因为比赛条件。您可以并行的是网格的设置。
除此之外,您的代码会出错
fancyFileName.c:23:9: error: collapsed loops not perfectly nested before ‘printf’
这是非常自我解释的。您不会在第一个循环后直接关闭第二个循环,因此这两个循环不能折叠成一个循环。没有这一行,它编译得很好(gcc 4.8.5)。
此外我不确定c99标准和omp,但是要确保你的循环索引是私有的。