Я пытаюсь распараллелить мою программу на C, которая читает 5000 файлов с данными и усредняет каждую строку по файлам.
Например,
Файл 1:
1
2
Файл 2:
3
4
Вывод будет:
2
3
Программа работает нормально, пока я не распараллелю ее, а затем получаю разные ответы при каждом запуске.
Программа выглядит так:
#pragma omp parallel for
for(int i=0; i<numFiles; i++){
//Process FILES
processFile(argv[i+2],alpha,entropySum,entropy2Sum);
}
Где processFiles открывает файл в argv и добавляет данные в строке i в массив entropySum [i], а данные ^ 2 в массив entropy2Sum [i].
После добавления всех данных я вывожу свою информацию, используя
for(int i=0; i<=TF; i++){
double avg=0, avg2=0, stdDev=0;
avg = entropySum[i]/numFiles;
avg2 = entropy2Sum[i]/numFiles;
stdDev = sqrt(avg2-pow(avg,2));
printf("%d\t%.12e\t%.12e\n",i,avg,stdDev);
}
Это пример различных результатов, которые я получаю:
$ ./calcEntropy 1 data/2019_01_07/L06/p_00/data*
0 0.000000000000e+00 0.000000000000e+00
1 3.805323999338e-01 1.739913615303e-01
2 9.195334281358e-01 1.935111917992e-01
3 1.263129144934e+00 1.592392740809e-01
4 1.437299446640e+00 1.069415304025e-01
**5 1.519477007427e+00 7.899186640180e-02**
6 1.540955646645e+00 8.134009585552e-02
7 1.562133860024e+00 6.672275284387e-02
**8 1.573666031035e+00 7.200051995992e-02**
9 1.577305749778e+00 6.905825416624e-02
10 1.584251429260e+00 7.170811783630e-02
11 1.606099624837e+00 7.026618801497e-02
12 1.587069341648e+00 6.714269884875e-02
$ ./calcEntropy 1 data/2019_01_07/L06/p_00/data*
0 0.000000000000e+00 0.000000000000e+00
1 3.805323999338e-01 1.739913615303e-01
2 9.195334281358e-01 1.935111917992e-01
3 1.263129144934e+00 1.592392740809e-01
4 1.437299446640e+00 1.069415304025e-01
**5 1.519114903273e+00 8.255618715434e-02**
6 1.540955646645e+00 8.134009585553e-02
7 1.562133860024e+00 6.672275284389e-02
**8 1.573666031035e+00 6.715192373223e-02**
9 1.577305749778e+00 6.905825416623e-02
10 1.584251429260e+00 7.170811783631e-02
11 1.606099624837e+00 7.026618801500e-02
12 1.587069341648e+00 6.714269884876e-02
После проверки в Интернете, я чувствую, что мне, вероятно, следует использовать сокращение? Но я не совсем уверен, как реализовать это в этом цикле с двумя переменными, которые увеличиваются (entropySum и entropy2Sum), а также увеличиваются внутри функции processFile.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или код. Спасибо.