在windows上设置pragma omp

时间:2017-01-20 20:40:00

标签: c++ multithreading openmp

我有一个并行值的代码,但我陷入了正确的openMP配置。上面的代码适用于使用gcc的Ubuntu,但是在Windows(mingw)上它获得了疯狂的结果值。不过,它在我运行单线程时有效,所以我认为这可能是一个错误的设置。对于这种情况,我想了解如何正确设置pragma omp的一些线索。

基本上,每个线程计算并向partialsum求和值。

#pragma omp parallel for firstprivate(subsetTemp) reduction (+:partialsum)
for(int j = 0; j < repetitions; j++){
    random_shuffle(SortOrder.begin(),SortOrder.end());

    for (unsigned int i1 = 0; i1 < subsetTemp.size(); i1++)
        for(unsigned int j1 = 0; j1 < subsetTemp[0].size(); j1++)
            subsetTemp[i1][j1]=0;

    for(int i1 = 0; i1 < currentsize; i1++){
        for(unsigned int j1 = 0; j1 < sequences[0].size(); j1++){
            subsetTemp[j1][freqmatrixposition(sequences[SortOrder[i1]][j1])]++;
            subsetTemp[sequences[0].size()][freqmatrixposition(sequences[SortOrder[i1]][j1])]++;
        }
    }

    for(unsigned int k = 0; k < populatedpos.size() - 1; k++){
        for(unsigned int l = 0; l <= 20; l++){
            double subsetfreq = (double)subsetTemp[k][l]/(double)currentsize;
            if(subsetfreq > 0){
                if(subsetfreq* log(subsetfreq) < 0) partialsum += (subsetfreq* log(subsetfreq) * -1);
                else partialsum += (subsetfreq* log(subsetfreq));
            }
        }
    }
}
outputVec.push_back((float)(partialsum/((long double)(populatedpos.size()*repetitions))));

由于

修改 关于输出,此代码运行100次改变currentSize,每次运行都会向outputVec添加一个值。当我在多线程中绘制outputVec时,看起来它有噪音。

Single thread graph

Multi thread graph

1 个答案:

答案 0 :(得分:0)

我得到了它的工作。主要问题是SortOrder。它应该是每次迭代的随机化,但由于它曾经是一个类变量,许多线程访问同一个列表,导致结果偏差。