【发布时间】:2017-04-20 10:02:02
【问题描述】:
我最近接触了 OpenMP 和并行编程,但在正确使用它时遇到了一些问题。
我想在以下代码上实现 OpenMP 以使其运行得更快。
int m = 101;
double e = 10;
double A[m][m], B[m][m];
for (int x=0; x<m; x++){
for (int y=0; y<m; y++){
A[x][y] = 0;
B[x][y] = 1;
}
}
while (e >= 0.0001){
for (int x=0; x<m; x++){
for (int y=0; y<m; y++){
A[x][y] = 0.25*(B[x][y] - 0.2);
}
}
e = 0;
for (int x=0; x<m; x++){
for (int y=0; y<m; y++){
e = e + abs(A[x][y] - B[x][y]);
}
}
}
我想同时运行循环而不是一个接一个地运行以加快运行时间。我相信下面的代码应该可以工作,但我不确定我是否正确使用了 OpenMP。
int m = 101;
double e = 10;
double A[m][m], B[m][m];
#pragma omp parallel for private(x,y) shared(A,B) num_threads(2)
for (int x=0; x<m; x++){
for (int y=0; y<m; y++){
A[x][y] = 0;
B[x][y] = 1;
}
}
while (e >= 0.0001){
#pragma omp parallel for private(x,y) shared(A,B) num_threads(2)
for (int x=0; x<m; x++){
for (int y=0; y<m; y++){
A[x][y] = 0.25*(B[x][y] - 0.2);
}
}
// I want to wait for the above loop to finish computing before starting the next
#pragma omp barrier
e = 0;
#pragma omp parallel for private(x,y) shared(A,B,e) num_threads(2)
for (int x=0; x<m; x++){
for (int y=0; y<m; y++){
e = e + abs(A[x][y] - B[x][y]);
}
}
}
我是否有效且正确地使用 OpenMP?另外,我不确定是否可以将 OpenMP 用于我的 while 循环,因为它需要先计算内部循环,然后才能确定是否需要再次运行。
【问题讨论】:
标签: c multithreading for-loop parallel-processing openmp