0
私はこのコードを並列の合計値にしていますが、私はopenMPの正しい設定に固執しています。上のコードはgccを使ってUbuntuで動作しますが、Windows(mingw)では狂った結果値を得ています。それにもかかわらず、私は単一のスレッドを実行すると動作するので、間違ったセットかもしれません。この場合、プラグマompを正しく設定する方法についての手がかりがほしいと思います。Windows上でプラグマompを設定する
基本的に、各スレッドは、算術値と部分和に値を合計します。出力について
#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))));
おかげ
EDIT を、このコードは、各実行はoutputVecに値を追加、currentSizeを変える100回を実行します。 outputVecをマルチスレッドでプロットすると、ノイズがあるように見えます。