Вложенный для цикла в программе openMP занимает слишком много времени - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с распараллеливанием моей программы с openMP.Первый цикл for занимает около 10 миллисекунд, а второй - около 45 секунд.Я не уверен, что я делаю что-то не так в цикле, который тратит время.

float A[M][M];
float B[M][M];
float C[M][M];

main(int argc, char** argv) {
float temp;
float real;
float error = 0;
int i,j,k;
double time_start;
double time_end;
double time_mid;
int n  = 12;

omp_set_num_threads(n);
time_start = omp_get_wtime();


#pragma omp parallel default(shared) private(i,j,k,temp,real) reduction(+:error)
#pragma omp for
for (i=0; i<M; i++) {
        for (j=0; j<M; j++) {
                A[i][j] = ((i+1)*(j+1))/(float)M;
                B[i][j] = (j+1)/(float)(i+1);
        }
}

time_mid = omp_get_wtime();
#pragma omp for
for (i=0; i<M; i++) {
        for (j=0; j<M; j++) {
                temp = 0;
                for (k=0; k<M; k++) {
                        temp += A[i][k]*B[k][j];
                }
            C[i][j] = temp;
            real =(float) (i+1)*(j+1);
            error = error + (float) fabs(temp-real)/real;

}
}


time_end = omp_get_wtime();
error = (100/(float)(M*M))*error;

printf("Percent error for C[][] is: %f\n", error);
printf("Time is: %f\n%f\n%f\n%f\n", time_end-time_start, time_start, time_mid, time_end);

return 0;
}

1 Ответ

0 голосов
/ 16 октября 2018

Из спецификаций OpenMP (стр. 35, 2.1 Формат директивы C / C ++)
https://www.openmp.org/wp-content/uploads/openmp-4.5.pdf

Исполняемая директива OpenMP применяется максимум для одного последующего оператора, который должен быть структурированным блоком.

Определение блока в C ++: stmt.block

Поэтому #pragma omp parallel default(shared) private(i,j,k,temp,real) reduction(+:error) будет применяться только к первому блоку (ваш первый цикл for)

Другие циклы не находятся в контексте #pragma omp parallel.

Используйте #pragma omp parallel{}, чтобы заключить второй цикл.

...