当前位置: 首页 > 网络知识

OpenMP 循环并行化和parallel for指令

时间:2026-01-26 14:19:53

从parallel到parallel for

  parallel for指令和parallel指令是不同的。

parallel

  parallel指令只是指明后面的代码块被并行执行,对共享下标的访问次序无法控制和预知:

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<p.h> 4 5 int main(int argc,char *argv[]) 6

多次输出

1 [lzh@hostlzh OpenMP]$ ./test2.o 2 2 我是0 3 我是0 4 我是0 5 我是0 6 我是0 7 我是0 8 我是1 9 [lzh@hostlzh OpenMP]$ ./test2.o 2 10 我是0 11 我是0 12 我是0 13 我是0 14 我是0 15 我是1 16 我是0 17 [lzh@hostlzh OpenMP]$ ./test2.o 2 18 我是0 19 我是0 20 我是0 21 我是0 22 我是0 23 我是0 24 我是1 25 我是1 26 我是1 27 我是1 28 我是1 29 我是1 30 [lzh@hostlzh OpenMP]$

parallel for

  而parallel for指令能将合法的典型结构的for循环并行化,且在parallel for中循环变量的缺省作用域是私有的,线程之间不会相互影响:

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<p.h> 4 5 int main(int argc,char *argv[]) 6

输出

1 [lzh@hostlzh OpenMP]$ ./test2.o 2 2 我是0 3 我是0 4 我是0 5 我是1 6 我是1 7 我是1 8 [lzh@hostlzh OpenMP]$

可见对for循环进行了块划分。

注意parallel for和parallel是完全不同的指令,parallel for指令后面直接跟随需要并行化的for,而不能像parallel那样修饰大括号扩起来的代码块。

能够被parallel for正确并行化的for循环
书上把这样的for循环称为典型的for循环。

for循环头的允许形式

对for循环体的限制
  循环次数必须由前面的for循环头本身确定,不能在循环体中做可能改变for循环次数判定的事情,如break和改变循环变量的值。

书上的例子
  这个例子使用parallel for并行化求ππ值的一个for循环。

  用reduction归约子句保护了加入总和的过程,当然这里使用critical子句也可以,但保护的机制截然不同。

  用private子句为符号变量sign设定了私有作用域,以保证每个线程对这个变量都有自己的副本,防止在使用前又被其它线程赋值改变。

  用ifelse判断解除了使用sign=sign改变符号变量时具有的循环依赖问题,即本次循环中使用了前面循环计算得到的结果。循环依赖在循环并行化中往往是有害的,因为并行化的程序往往不按照串行的时间线执行,依赖了其它迭代次的数据是错误的,或者有时候所依赖的数据还没有计算出来(如斐波那契数列)。

  而对于循环变量i,因为在parallel for指令中,循环变量的缺省作用域是私有的,所以它已经受到保护。

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<p.h> 4 5 int main(int argc,char *argv[]) 6 25 printf("pi=%f\n",4*sum);//这个级数*4近似为pi 26 return 0; 27 }

输出

1 [lzh@hostlzh OpenMP]$ !gcc 2 gcc fopenmp o test2.o test2 3 [lzh@hostlzh OpenMP]$ ./test2.o 5 4 pi=3.141493 5 [lzh@hostlzh OpenMP]$

私有作用域的变量在parallel和parallel for块刚开始时和结束后都是未指定的。



上一篇:Qt 报错:Enigma Virtual Box 打包过的 exe 报错 cannot load library Qt5Core.dll
下一篇:C++ 计时方法 std::chrono
OpenMP
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素