OpenMP - простейший накопитель в циклах дает неверный результат

Я использую компилятор Intel C++ и запускаю программу на 16 потоках. Я хочу, чтобы первый цикл работал параллельно. Я думаю, результат "count" должен быть 30000000. Однако это оказалось чем-то меньше 30000000. Где ошибка? Благодарю!

#include <stdio.h>
#include <omp.h>
int main(){
 long count = 0;
 #pragma omp parallel
 {
 #pragma omp for
 for (long i = 0; i < 10000000; i++){
 for (int j = 0; j < 3; j++){
 count++;
 }
 }
 }
 printf("%d", count);
}
</omp.h></stdio.h>
2 ответа

Вы запрограммировали каноническую гонку данных. Все потоки в вашей программе конкурируют за обновление count переменных, и нет никаких гарантий относительно порядка, в котором каждый поток читает, обновляет, а затем записывает значения в переменную. Все, что вы можете поверить C++, не гарантирует, что ++ применяется атомарно.

Вы должны прочитать в своем учебнике OpenMP, чтобы узнать об общих (и частных) переменных, а также о сокращениях.

Если вы ищете здесь здесь, то вы должны найти похожие вопросы, некоторые из них с ответами, включая код, чтобы показать вам, как делать то, что вы пытаетесь сделать.


Вы также можете направить omp для выполнения вашего приращения атомарно, вставив:

#pragma omp atomic

перед вашей count++ линией. Затем вы избегаете условия гонки, описанные HPM ранее. См. Http://msdn.microsoft.com/en-us/library/8ztckdts.aspx или https://computing.llnl.gov/tutorials/openMP/#ATOMIC

licensed under cc by-sa 3.0 with attribution.