OpenMP中的私有二维数组

时间:2017-11-17 15:57:39

标签: c++ openmp

就我在多个源中找到的情况而言,当将数组作为private传递到OpenMP控件块时,每个线程都应该使它成为此数组的副本。但是,我在一段代码中看到了不同的行为,具有以下结构:

int row, col;
int s[9][9];
omp_set_num_threads(9);
#pragma omp parallel for firstprivate(s)
    for (int val = 1; val < 10; val++) {                                        
        s[row][col] = val;  
        bool b = solve(s, row + col / 9, (col + 1) % 9);
        if (b) {
            //do stuff
        }   
    }

其中函数solve()确实修改变量s,但不触及任何全局变量。

但是,我发现,通过例程求解修改变量s(对于包含在底部的完整性),也会影响所有其他线程中的变量s

这是二维数组的问题还是我忽略了一些基本的东西?

常规solve()

bool solve(int s[9][9], int row, int col) { 
    while(s[row][col] != 0) {
        col = (col + 1) % 9;
        row = row + col / 8;
        if(row == 9)        
            return true;
    }   

    for (int val = 1; val < 10; val++) {
        if (isPossible(s,row,col,val)){
            s[row][col] = val;
            if (solve(s, row + col / 9, (col + 1) % 9))
                return true;
            s[row][col] = 0;
        }
    }
    return false;
}

0 个答案:

没有答案