因此,我尝试学习OpenMP API,但基础知识不足,但这部分让我感到困惑:(可测试代码!)

#include <iostream>
#include <cstdlib>
#include <string>
#include <omp.h>
#include <unistd.h>

using namespace std;
const int col = 10, row = 10;
int c[][11] = {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
               {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}  };

int main(int argc, char** argv)
{
int temp[3] = {-1, -1, -1};
int id;
for (unsigned short i = 0; i < 10; i++){
    #pragma omp parallel shared(c) firstprivate(i) private(temp)
    {
        #pragma ivdep
        #pragma omp for schedule(static, 1) //private(id)//,m_i, ind)
        for(unsigned short j = 0; j < 10; j++){
            // calculate c
            /*  old
            temp[0] = c[i-1][j-1]+3;
            temp[1] = c[i-1][j]-4;
            temp[2] = c[i][j-1]-5;
            c[i][j] = temp[0];
            c[i][j] = temp[1];
            c[i][j] = temp[2];
            */
            temp[0] = c[i][j-1]+3;
            c[i][j] = temp[0];
        }
    }
}
// print c
for (int i = 0; i< row + 1; i++)
{
    for (int j = 0; j< col + 1; j++)
    {
        cout << c[i][j] << "/";
    }
    cout << endl;
}
 } // end main

我相信代码是不言自明的,我只想补充一点,我只想并行化内部循环,因为我希望外部循环与c数组中的依赖项一起使用。
rowcol变量也可以用于控制数组的尺寸。

我使用这个bash脚本来运行整个过程
#!/bin/bash
g++ -O0 -o xx par_test.cpp -fopenmp
export OMP_NUM_THREADS=1 # or 2 or 4
./xx

但是,当我使用多个1个线程时,输出会有所不同。OMP_NUM_THREADS=1的输出(一致)
c&#43;&#43; - openmp/C&#43;&#43;简单并行区域返回不一致的结果-LMLPHP
OMP_NUM_THREADS=2的输出(每次执行都会返回不同的结果)
c&#43;&#43; - openmp/C&#43;&#43;简单并行区域返回不一致的结果-LMLPHP
OMP_NUM_THREADS=4的输出(每次执行都会返回不同的结果)
c&#43;&#43; - openmp/C&#43;&#43;简单并行区域返回不一致的结果-LMLPHP

我还尝试过的事情:

带有&不带矢量化功能(即带有&不带#pragma ivdep的
  • )
  • threadprivate(temp)这里也没有运气。

  • 由于单线程执行始终具有相同的输出,因此我很确定我的变量共享存在问题,但是无论如何我还是会感到困惑。

    在此先感谢您的时间。

    最佳答案

    您正在通过j进行并行循环:

        #pragma omp for schedule(static, 1)
        for(unsigned short j = 0; j < 10; j++){
            // calculate c
            temp[0] = c[i][j-1]+3;
            c[i][j] = temp[0];
        }
    

    您引用了c[i][j-1]单元格,但是有可能在另一个线程中计算了该值。您如何确定这已经发生?

    关于c++ - openmp/C++简单并行区域返回不一致的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37634714/

    10-10 12:44