C openMP程序中的嵌套for循环花费的时间太长

C openMP程序中的嵌套for循环花费的时间太长,c,for-loop,parallel-processing,openmp,matrix-multiplication,C,For Loop,Parallel Processing,Openmp,Matrix Multiplication,我在用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 t

我在用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;
}
浮动A[M][M];
浮动B[M][M];
浮点数C[M][M];
主(内部argc,字符**argv){
浮子温度;
浮动真实;
浮动误差=0;
int i,j,k;
双倍启动时间;
双倍时间结束;
双倍时间;
int n=12;
omp_设置_数量_线程(n);
time_start=omp_get_wtime();
#pragma omp并行默认(共享)私有(i、j、k、temp、real)缩减(+:错误)
#pragma omp for

对于OpenMP规范(第35页,2.1指令格式C/C++)中的(i=0;i)

OpenMP可执行指令最多应用于一个 语句,它必须是结构化块

< C++中块的定义是

因此,
#pragma omp并行默认(共享)私有(i,j,k,temp,real)缩减(+:error)
将仅应用于第一个块(您的第一个for循环)

其他循环不在“
#pragma omp parallel
”上下文中


使用
#pragma omp parallel{}
将第二个循环括起来。

您的
parallel
指令只包含第一个循环。您缺少一些花括号来创建指令块。因此循环编号2是顺序的。非常简单。谢谢。之后,它从45秒下降到5秒。