gpt4 book ai didi

c - omp for 和 omp parallel 的区别

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:24 29 4
gpt4 key购买 nike

我有这段代码:

#include <omp.h>
#include <stdio.h>

int main(){
int i,j = 0 ;
int tid;
# pragma omp parallel private(i,j,tid)
{
tid = omp_get_thread_num();
printf("Thread %d\n",tid);
for(i=0;i<10;i++){
# pragma omp for
for(j=0; j<10;j++){
tid = omp_get_thread_num();
printf("(i,j) = (%d,%d) Thread %d\n",i,j,tid);
}
}
}
return 0;
}

为什么第一个“printf”被每个线程执行而不是第二个?

最佳答案

“omp parallel”启动一个 parallel region .当线程进入该区域时,通常会启动一组线程,进入的线程将成为主线程。然后,团队中的所有线程都执行代码,直到并行区域结束,线程在并行区域重新加入主线程。

因为 omp parallel 启动了一个并行区域,这就是像你的 private(i,j,tid) go 子句这样的子句,它定义了如何在区域内处理变量(默认、私有(private)、 shared、reduction 等)在并行区域开始时给出,连同可选择设置线程数 (num_threads) 的子句。

但通常让多个线程在并行区域中执行完全相同的步骤并不是您想要的;您希望每个线程执行不同的任务,或者处理某个问题的单独部分。因此 OpenMP 有 worksharing constructs ,包括“omp for”。在 OpenMP for 的情况下,循环迭代在线程之间拆分,因此只有一个线程获得循环的每个迭代。 (为了让它起作用,循环本身有条件。)设置 for 循环如何在线程之间分解的子句 - (schedule, collapse) 放在这里,以及对迭代如何执行(排序)的限制,以及一些关于如何在 for 循环中处理变量的子句。 C 中工作共享构造的其他示例是单一的 - 只有一个线程执行工作 - 任务和部分。

所以所有线程都执行第一个printf语句,因为队内所有线程都命中了它。但是 for 循环迭代在线程之间被拆分,每个 j 只被一个线程打印出来。

如果在并行区域开始和 for 循环开始之间不需要任何代码,可以将这两个指令组合为“omp parallel for”,它既启动并行区域又拆分(立即)在线程之间进行循环。

关于c - omp for 和 omp parallel 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389205/

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