2017-01-20 9 views
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をマルチスレッドでプロットすると、ノイズがあるように見えます。

Single thread graph

Multi thread graph

答えて

0

私はそれが動作するようになりました。主に問題はSortOrderで発生しました。それは反復ごとにランダム化する必要がありましたが、以前はクラス変数であったため、多くのスレッドが同じリストにアクセスしていたため、結果に偏りが生じました。

関連する問題