循环崩溃中的OpenMP错误

时间:2016-04-20 14:33:17

标签: c parallel-processing openmp

在下面的代码中,我试图并行化一个打印二维数组的嵌套循环。我经历了教程,发现我必须使用崩溃条款:

#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

崩溃是正确的解决方案,以产生正确的结果?如果是这样,为什么我会收到上述错误?

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,但是要确保你的循环索引是私有的。