【问题标题】:Nested for loop in openMP program taking too longopenMP 程序中的嵌套 for 循环耗时过长
【发布时间】:2019-03-20 13:50:24
【问题描述】:

我在使用 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;
}

【问题讨论】:

  • 您的 parallel 指令仅包含第一个循环。您缺少一些大括号来为您的指令创建一个块。所以循环编号 2 是连续的。
  • 如此简单。谢谢。之后它从 45 秒下降到 5 秒。

标签: c for-loop parallel-processing openmp matrix-multiplication


【解决方案1】:

来自 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{} 封闭第二个循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多