Когда требуется сокращение?

Я написал этот код, который читает Матрицу и в основном суммирует значения матрицы … Но мой вопрос был бы, так как я пытался сделать прагму по-разному, я обнаружил, что reduction (+:sum) не было бы необходимо, но, я просто не знаю, почему, я мог бы упустить реальное чувство системы восстановления в этом случае. Это было бы альтернативой: #pragma omp parallel for private(i, j) reduction (+:sum)

И это будет код:

 #include  #include  #include  #include  int main () { printf("===MATRIX SUM===\n"); printf("N ROWS: "); int i1; scanf("%d",&i1); printf("M COLUMNS: "); int j1; scanf("%d",&j1); int matrixA[i1][j1]; int i, j; for(i = 0; i < i1; i++){ for (j = 0; j < j1; j++){ scanf("%d",&matriuA[i][j]); } } printf("\nMATRIX A: \n"); for (i = 0; i < i1; i++){ for (j = 0; j < j1; j++){ printf("%d ", matrixA[i][j]); } printf("\n"); } int sum = 0; #pragma omp parallel for private(i, j) for (i = 0; i < i1; i++) for (j = 0; j < j1; j++){ sum += matrixA[i][j]; } printf("\nTHE RESULT IS: %d", sum); return 0; } 

И я хотел бы спросить, будет ли это похоже, лучшее решение для уменьшения прагмы, поскольку я читаю, что это самый эффективный способ.

Код, который вы опубликовали, неверен без предложения сокращения .

 sum += matrixA[i][j]; 

Приведёт к classическому состоянию гонки при параллельном выполнении нескольких streamов. Сумма является общей переменной, но sum += ... не является атомной операцией.

 (sum is initially 0, all matrix elements 1) Thread 1 | Thread 2 ----------------------------------------------------------- tmp = sum + matrix[0][0] = 1 | | tmp = sum + matrix[1][0] = 1 sum = tmp = 1 | | sum = tmp = 1 (instead of 2) 

Сокращение фиксирует именно это. С сокращением цикл будет работать на неявной нить-локальной копии переменной sum . В конце региона исходная переменная sum будет установлена ​​на сумму всех локально-локальных копий (правильным образом без условий гонки).

Другим решением было бы отметить sum += ... как атомную операцию или критический раздел. Это, однако, имеет значительный штраф в исполнении.