У меня есть этот код для параллельной суммы значений, но я застрял в правильной настройке 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 в многопоточном режиме, похоже, что он имеет шум.