2017-01-20 3 views
0

У меня есть этот код для параллельной суммы значений, но я застрял в правильной настройке openMP. Код выше работает на Ubuntu с gcc, но в Windows (mingw) он получает сумасшедшие значения результата. Тем не менее, он работает, когда я запускаю один поток, поэтому я думаю, что это может быть неправильный набор. Мне бы хотелось, чтобы некоторые подсказки о том, как правильно настроить pragma omp для этого случая.Настройка pragma 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 О выходе, этот код работает в 100 раз варьируя currentSize, каждый прогон добавить значение в outputVec. Когда я делаю вывод outputVec в многопоточном режиме, похоже, что он имеет шум.

Single thread graph

Multi thread graph

ответ

0

Я получил его на работу. В основном проблема была в SortOrder. Он должен быть рандомизирован для каждого итерации, но поскольку он использовался как переменная класса, многие потоки обращались к одному списку, что приводило к смещению результатов.

Смежные вопросы