Я очень новичок в openMP, но пытаюсь написать простую программу, которая генерирует элементы матрицы параллельно, а именно для матрицы A от N до M, пусть A (i, j) = i * j.Ниже приведен минимальный пример:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc,
char **argv)
{
int i, j, N, M;
N = 20;
M = 20;
int* A;
A = (int*) calloc(N*M, sizeof(int));
// compute entries of A in parallel
#pragma omp parallel for shared(A)
for (i = 0; i < N; ++i){
for (j = 0; j < M; ++j){
A[i*M + j] = i*j;
}
}
// print parallel results
for (i = 0; i < N; ++i){
for (j = 0; j < M; ++j){
printf("%d ", A[i*M + j]);
}
printf("\n");
}
free(A);
return 0;
}
Результаты не всегда верны.Теоретически я распараллеливаю только внешний цикл, и каждая итерация цикла for не изменяет записи, которые будут изменять другие итерации.Но я не уверен, как перевести это на openMP.При выполнении аналогичной процедуры для векторного массива (т. Е. Только один для цикла), кажется, нет никаких проблем, например,
#pragma omp parallel for
for (i = 0; i < N; ++i)
{
v[i] = i*i;
}
Может кто-нибудь объяснить мне, как это исправить?