小编nic*_*ick的帖子

如何避免嵌套循环中openMP的开销

我有两个版本的代码产生相同的结果,我试图只并行化嵌套for循环的内部循环.我没有得到太多的加速,但我没想到1对1,因为我只想并行化内循环.

我的主要问题是为什么这两个版本的运行时间相似?不是第二个版本的fork线程只有一次并且避免了i在第一个版本中每次迭代时启动新线程的开销吗?

第一个版本的代码在外部循环的每次迭代中启动线程,如下所示:

for(i=0; i<2000000; i++){
  sum = 0;
  #pragma omp parallel for private(j) reduction(+:sum)
  for(j=0; j<1000; j++){
    sum += 1;
  }
  final += sum;
}
printf("final=%d\n",final/2000000);
Run Code Online (Sandbox Code Playgroud)

使用此输出和运行时:

OMP_NUM_THREADS = 1

final=1000
real    0m5.847s
user    0m5.628s
sys     0m0.212s
Run Code Online (Sandbox Code Playgroud)

OMP_NUM_THREADS = 4

final=1000
real    0m4.017s
user    0m15.612s
sys     0m0.336s
Run Code Online (Sandbox Code Playgroud)

第二个版本的代码在外部循环之前启动一次线程(?)并像这样并行化内部循环:

#pragma omp parallel private(i,j)
for(i=0; i<2000000; i++){
  sum = 0;
  #pragma omp barrier
  #pragma omp for reduction(+:sum)
  for(j=0; j<1000; j++){
    sum += 1;
  }
  #pragma omp single …
Run Code Online (Sandbox Code Playgroud)

c openmp

11
推荐指数
1
解决办法
857
查看次数

标签 统计

c ×1

openmp ×1