并行化错误共享Openmp

时间:2016-01-20 10:59:42

标签: c++ parallel-processing openmp

我有一个整数矩阵,例如:

1 0 1
2 1 0
1 1 1

这是一个微不足道的例子;我的问题比这个例子大得多(想象2000 x 2000)。我必须按照这个规则修改矩阵:我必须做两个步骤:(1)如果矩阵中1下面的元素是0,那么我的移动应该是"1",然后( 2)如果矩阵中2右边的元素为0,我的移动应该是"2"

我正在使用两个向量来保存一个和两个的位置。这些向量是std::vector<triplet>,其中三元组是struct来处理问题:

struct triplet{
    int row, column, move;
};

因此vector1的每个元素都包含1(行和列)的位置和变量move(即0或1)以显示我是否可以移动相关的1。 我对载体2分别做了同样的事情。

void modifyvector1(vector<vector<int>>& matrix,vector<triplet>& vector1,int nrow,int ncolumn)
{
    #pragma omp parallel for
    for (int scorriblu = 0; scorriblu < vector1.size(); scorriblu++) {

        int i = vector1[scorriblu].row;
        int j = vector1[scorriblu].column;
        vector1[scorriblu].move = 0;

        if(i != nrow) {
            if (matrix[i+1][j] == EmptySpace) {
                vector1[scorriblu].move = 1;
            }
        }
        else {
            if (matrix[0][j] == EmptySpace) {
                vector1[scorriblu].move = 1;
            }
        }
    }
}

但是,这个程序比串行慢。我认为主要问题是每个线程都试图访问存储在共享内存中的矩阵,这导致了巨大的不同。但我不确定这是问题,以及如何解决它。

很抱歉我的解释,但我是C ++和OpenMP的新手。

0 个答案:

没有答案