我有一个并行值的代码,但我陷入了正确的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时,看起来它有噪音。
答案 0 :(得分:0)
我得到了它的工作。主要问题是SortOrder。它应该是每次迭代的随机化,但由于它曾经是一个类变量,许多线程访问同一个列表,导致结果偏差。