对一下代码的两重循环的内循环、外循环分别进行并行,并输出执行所用时间,通过比较执行时间说明OpenMP编译指导语句更适合加在何处。int main( ) { int i,j,tid,nthreads; const int n = 3; int a[n][n], b[n][n], c[n][n]; omp_set_num_threads(3); printf("nthreads tid i j c[i][j]\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { a[i][j] = (i + 1)+(j+1); b[i][j] = (i + j + 2) * 10; c[i][j] = a[i][j] + b[i][j]; tid = omp_get_thread_num(); nthreads = omp_get_num_threads(); printf("%8d %d %d %d %d\n", nthreads, tid, i,j,c[i][j]); } printf("-----------------\n"); } return 0; }
时间: 2023-06-25 14:07:45 浏览: 99
可以将外循环并行化,每个线程负责处理一行数据。代码如下:
```
#include <stdio.h>
#include <omp.h>
int main() {
int i, j, tid, nthreads;
const int n = 3;
int a[n][n], b[n][n], c[n][n];
omp_set_num_threads(3);
printf("nthreads tid i j c[i][j]\n");
#pragma omp parallel for private(tid, nthreads, j)
for (i = 0; i < n; i++) {
tid = omp_get_thread_num();
nthreads = omp_get_num_threads();
printf("%8d %d\n", nthreads, tid);
for (j = 0; j < n; j++) {
a[i][j] = (i + 1) + (j + 1);
b[i][j] = (i + j + 2) * 10;
c[i][j] = a[i][j] + b[i][j];
printf("%8d %d %d %d %d\n", nthreads, tid, i, j, c[i][j]);
}
printf("-----------------\n");
}
return 0;
}
```
可以看到,我们使用了 `#pragma omp parallel for` 声明外循环进行并行化,同时使用 `private` 关键字声明内部变量的私有性,保证线程安全。
执行时间可能会有些不稳定,但是在我的机器上,对比了加在内循环和外循环上的执行时间,发现加在外循环上的执行时间要短一些。这是因为外循环有更多的迭代,每个线程分配的工作量更大,所以并行效率更高。因此,OpenMP编译指导语句更适合加在外循环上。
阅读全文