#pragma omp parallel和#pragma omp parallel之间的区别

哈斯·卡塔(Hath Kata Kartic)

我是新手OpenMP,我一直在尝试运行一个使用OpenMP添加两个数组的程序。在OpenMP教程中,我了解到,for循环上使用OpenMP时,需要并行使用#pragma omp但是我也使用#pragma omp parallel尝试了同样的事情,它也给了我正确的输出。以下是我要传达的代码片段。

#pragma omp parallel for
{
      for(int i=0;i<n;i++)
       {  
            c[i]=a[i]+b[i];
       }
}

 #pragma omp parallel
{
      for(int i=0;i<n;i++)
       {  
            c[i]=a[i]+b[i];
       }
}

两者有什么区别?

梦境崩溃

#pragma omp parallel

将创建一parallel region组的threads,其中每个线程将执行parallel region封装的整个代码块

OpenMP 5.1可以阅读更正式的描述:

当线程遇到并行构造时将创建一组线程以执行并行区域(..)。遇到并行构造的线程将成为新团队的主线程,在新并行区域的持续时间内线程数为零。新团队中的所有线程(包括主线程)都将执行区域。创建团队后,团队中的线程数在该并行区域的持续时间内保持不变。

该:

#pragma omp parallel for

将创建一个parallel region(如前所述),并以threads该区域的,它包围所述循环迭代将被分配,使用default chunk sizedefault schedule其是典型地 static但是请记住,default scheduleOpenMP标准的不同具体实现之间的差异可能会有所不同

OpenMP 5.1中,您可以阅读更正式的说明:

workharing-loop构造指定一个或多个关联循环的迭代将由团队中的线程在其隐式任务的上下文中并行执行。迭代分布在执行工作共享循环区域绑定到的并行区域的团队中已经存在的线程之间

而且

并行循环构造是一种用于指定并行构造的捷径,该并行构造包含具有一个或多个关联循环且没有其他语句的循环构造。

或者非正式地,#pragma omp parallel for是构造函数#pragma omp parallel的组合#pragma omp for在您的情况下,这意味着:

#pragma omp parallel for
{
      for(int i=0;i<n;i++)
       {  
            c[i]=a[i]+b[i];
       }
}

在语义和逻辑上与以下内容相同:

#pragma omp parallel
{
      #pragma omp for
      for(int i=0;i<n;i++)
       {  
            c[i]=a[i]+b[i];
       }
}

TL; DR:在您的示例中,使用#pragma omp parallel for循环将在线程之间并行化(即,循环迭代将在线程之间划分),而使用#pragma omp parallel 所有线程将执行(并行)所有循环迭代。

为了使其更具说明性,使用4线程#pragma omp parallel将导致类似以下内容:

在此处输入图片说明

#pragma omp parallel forchunk_size=1 schedule会导致类似:

在此处输入图片说明

在代码方面,循环将被转换为类似于以下内容的逻辑

for(int i=omp_get_thread_num(); i < n; i+=omp_get_num_threads())
{  
    c[i]=a[i]+b[i];
}

其中omp_get_thread_num()

omp_get_thread_num例程返回当前线程组中调用线程的线程号。

omp_get_num_threads()

返回当前团队中的线程数。在程序的顺序部分,omp_get_num_threads返回1。

或换句话说,for(int i = THREAD_ID; i < n; i += TOTAL_THREADS)THREAD_ID范围从0TOTAL_THREADS - 1,并TOTAL_THREADS表示在并行区域中创建的团队的线程的总数。

我了解到,在for循环上使用OpenMP时,需要并行使用#pragma omp。但是我也使用#pragma omp parallel尝试了同样的事情,它也给了我正确的输出。

它会为您提供相同的输出,因为在您的代码中:

 c[i]=a[i]+b[i];

只读取arraya和array b,而arrayc[i]是唯一要更新的数组,其值不取决于迭代i将执行多少次不过,#pragma omp parallel for每个线程都会更新自己的i,而每个线程都会更新#pragma omp parallel相同i的,因此会覆盖彼此的值。

现在尝试使用以下代码执行相同的操作:

#pragma omp parallel for
{
      for(int i=0;i<n;i++)
       {  
            c[i]= c[i] + a[i] + b[i];
       }
}

#pragma omp for
{
      for(int i=0;i<n;i++)
       {  
            c[i] = c[i] + a[i] + b[i];
       }
}

您将立即注意到差异。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

#pragma parallel for crash和#pragma omp parallel for之间的区别

来自分类Dev

#pragma omp parallel for schedule使我的程序崩溃

来自分类Dev

#pragma omp parallel for schedule使我的程序崩溃

来自分类Dev

与“ #pragma omp single”相比,“#pragma omp master”有什么好处?

来自分类Dev

使用pragma omp simd这样正确吗?

来自分类Dev

c中的pragma omp快捷方式

来自分类Dev

英特尔的pragma simd与OpenMP的pragma omp simd

来自分类Dev

“ #pragma omp master”相对于“ #pragma omp single”有什么好处?

来自分类Dev

ompcritical和omp single之间的区别

来自分类Dev

Pragma OMP平行于vs. 实用程序并行

来自分类Dev

OMP:OMP并行DO和OMP DO有什么区别(完全没有并行指令)

来自分类Dev

了解!$ omp parallel do reduction(...)的正确用法

来自分类Dev

通过将#omp parallel和#omp for分开来减少OpenMP fork / join的开销

来自分类Dev

内部嵌套循环的Pragma omp在嵌套循环(C ++)中未正确忽略

来自分类Dev

为什么“#pragma omp critical”部分不能在同一行上有大括号?

来自分类Dev

与omp并行

来自分类Dev

如何使用 `omp parallel` 或其他方式并行化 for 循环?

来自分类Dev

num_threads与omp_set_num_threads与OMP_NUM_THREADS之间的差异

来自分类Dev

omp_get_num_threads()和omp_get_thread_num()返回废话

来自分类Dev

如何用OMP任务和递归任务工作量衡量OMP时间?

来自分类Dev

std :: lock_guard和#pragma ompcritical之间的区别

来自分类Dev

与omp卡住平行

来自分类Dev

OMP 2.0嵌套循环

来自分类Dev

Omp返回错误的值

来自分类Dev

OMP更新向量问题

来自分类Dev

omp屏障嵌套线程

来自分类Dev

锁定OMP区域

来自分类Dev

带有循环迭代器和omp simd的private子句

来自分类Dev

向量乘法中的SIMD与OMP

Related 相关文章

  1. 1

    #pragma parallel for crash和#pragma omp parallel for之间的区别

  2. 2

    #pragma omp parallel for schedule使我的程序崩溃

  3. 3

    #pragma omp parallel for schedule使我的程序崩溃

  4. 4

    与“ #pragma omp single”相比,“#pragma omp master”有什么好处?

  5. 5

    使用pragma omp simd这样正确吗?

  6. 6

    c中的pragma omp快捷方式

  7. 7

    英特尔的pragma simd与OpenMP的pragma omp simd

  8. 8

    “ #pragma omp master”相对于“ #pragma omp single”有什么好处?

  9. 9

    ompcritical和omp single之间的区别

  10. 10

    Pragma OMP平行于vs. 实用程序并行

  11. 11

    OMP:OMP并行DO和OMP DO有什么区别(完全没有并行指令)

  12. 12

    了解!$ omp parallel do reduction(...)的正确用法

  13. 13

    通过将#omp parallel和#omp for分开来减少OpenMP fork / join的开销

  14. 14

    内部嵌套循环的Pragma omp在嵌套循环(C ++)中未正确忽略

  15. 15

    为什么“#pragma omp critical”部分不能在同一行上有大括号?

  16. 16

    与omp并行

  17. 17

    如何使用 `omp parallel` 或其他方式并行化 for 循环?

  18. 18

    num_threads与omp_set_num_threads与OMP_NUM_THREADS之间的差异

  19. 19

    omp_get_num_threads()和omp_get_thread_num()返回废话

  20. 20

    如何用OMP任务和递归任务工作量衡量OMP时间?

  21. 21

    std :: lock_guard和#pragma ompcritical之间的区别

  22. 22

    与omp卡住平行

  23. 23

    OMP 2.0嵌套循环

  24. 24

    Omp返回错误的值

  25. 25

    OMP更新向量问题

  26. 26

    omp屏障嵌套线程

  27. 27

    锁定OMP区域

  28. 28

    带有循环迭代器和omp simd的private子句

  29. 29

    向量乘法中的SIMD与OMP

热门标签

归档