gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:28 26 4
gpt4 key购买 nike

我在使用 openMP 并行化我的程序时遇到问题。第一个 for 循环大约需要 10 毫秒,而第二个 for 循环大约需要 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;
}

最佳答案

来自 OpenMP 规范(第 35 页,2.1 指令格式 C/C++)
https://www.openmp.org/wp-content/uploads/openmp-4.5.pdf

An OpenMP executable directive applies to at most one succeeding statement, which must be a structured block.

C++中 block 的定义是stmt.block

因此 #pragma omp parallel default(shared) private(i,j,k,temp,real) reduction(+:error) 将仅适用于第一个 block (您的第一个 for 循环)

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

使用 #pragma omp parallel{} 包含第二个循环。

关于c - openMP 程序中的嵌套 for 循环花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52828513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com