C omp for和omp parallel之间的差异

C omp for和omp parallel之间的差异,c,multithreading,openmp,C,Multithreading,Openmp,我有以下代码: #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++){

我有以下代码:

#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;
}
#包括
#包括
int main(){
int i,j=0;
国际贸易署;
#pragma omp并行专用(i、j、tid)
{
tid=omp_get_thread_num();
printf(“线程%d\n”,tid);
对于(i=0;i“omp并行”启动一个。当一个线程进入该区域时,通常会启动一个线程组,该线程组将成为主线程。然后,该组中的所有线程都会执行代码,直到并行区域结束,在该区域中,线程连接回主线程

因为omp parallel启动一个并行区域,所以在并行区域启动时,将给出定义如何在该区域内处理变量(默认、专用、共享、缩减等)的
private(i、j、tid)
go子句,以及可选地设置线程数的子句(线程数)

但通常情况下,让多个线程在并行区域中执行完全相同的步骤并不是您想要的;您希望每个线程执行不同的任务,或者处理某个问题的单独部分。在循环的情况下,循环迭代在线程之间分割,以便只有一个线程获得循环的每次迭代。(为此,循环本身有条件。)设置如何在线程之间分解For循环的子句-(调度,折叠)转到这里,还有关于如何执行迭代(排序)的限制,以及关于如何在for循环中处理变量的一些条款。C中工作共享结构的其他示例是单线程-只有一个线程执行工作-任务和部分

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

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

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

因为omp parallel启动一个并行区域,所以在并行区域启动时,将给出定义如何在该区域内处理变量(默认、专用、共享、缩减等)的
private(i、j、tid)
go子句,以及可选地设置线程数的子句(线程数)

但通常情况下,让多个线程在并行区域中执行完全相同的步骤并不是您想要的;您希望每个线程执行不同的任务,或者处理某个问题的单独部分。在循环的情况下,循环迭代在线程之间分割,以便只有一个线程获得循环的每次迭代。(为此,循环本身有条件。)设置如何在线程之间分解For循环的子句-(调度,折叠)转到这里,还有关于如何执行迭代(排序)的限制,以及关于如何在for循环中处理变量的一些条款。C中工作共享结构的其他示例是单线程-只有一个线程执行工作-任务和部分

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


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

值得指出的是,
omp parallel for
的目的不是使代码更短,而是避免必须更改原始代码。如果只有
omp parallel
omp for
,则不使用
-fopenmp
编译的串行代码将不同n以前是这样。@Zboson,如果两个指令都在两个连续的代码行上,并且在它们之间没有其他语言构造,那就不是这样了。@HristoIliev,说得好,所以我错了。谢谢你纠正我。我想为
并行的目的只是为了保存一行代码。@HristoIliev,那么我在这里说的一件事并不完全正确可以这样做
#pragma parallel private(j)
new line then
#pragam omp for
,它不会更改原始代码。@Zboson,它是一种快捷表示法,可能是为了保存代码,特别是在Fortran中,它保存了三行代码。但两者之间存在一些语义差异,因为某些工作共享结构采用的子句在
中也有效>并行
构造。幸运的是,该标准规定:如果程序的行为取决于子句是应用于并行构造还是应用于工作共享构造,那么它就是UB。值得指出的是,
omp parallel for
的目的不是缩短代码,而是避免必须更改原始代码代码。如果只有
omp parallel
omp for
的话,在没有
-fopenmp
的情况下编译的串行代码将与以前不同。@Zboson,如果两个指令都在两个连续的代码行上,并且在它们之间没有其他语言结构,那就不是了。@HristoIliev,说得好,所以我错了。谢谢你纠正我的错误e、 我猜
parallel for
的目的只是为了