OpenMP中不建议使用并行嵌套,如果一个并行计算中的某个线程遇到了另外一个并行分支,程序运行将会变得不稳定。将一个完整的工作任务通过一组并行线程分成若干小任务,每个线程只执行指定给它的那段代码,并没用多余的线程去做其他的工作,即使并行计算中正在运行的某个线程遇到了一个新的并行分支,通过分割这个任务形成更多的线程,这并没有任何实际意义。因此,嵌套并行在OpenMP中将不考虑。OpenMP在处理多级并行嵌套时默认采用串行的执行方式,所以采用多级的并行在程序执行上并不会获得更高的计算效率。
下面通过一个例子来说明OpenMP中的并行嵌套。代码如下:
这是一个简单的并行嵌套,运行结果如下:
j Threads:jThreads:1
ThreadID:01 ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
i=2 Threads:8
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
j Threads:1ThreadID:0
i=3 Threads:8
i=0 Threads:8
j Threads:1ThreadID:0
i=1 Threads:8
从输出结果可以发现,在i的循环中循环之间处于并行状态,而在j中循环属于串行。默认情况下即使将j循环定义成并行,其内部执行时仍然按串行方式运行。
若需要使用嵌套并行,则需要使用
omp_set_nested()函数设置在程序中可用并行嵌套。如下例子:
运行程序,其结果如下:
是否支持并行嵌套:0
是否支持并行嵌套:1
i=i=1 j=2 Threads:8i=0 j=0 Threads:8ThreadID:0
ThreadID:2
i=0j=3 Threads:8 ThreadID:3
i=0j=1 Threads:8 ThreadID:1
i=1j=3 Threads:8 ThreadID:3
i=1j=1 Threads:8 ThreadID:1
0 j=2Threads:8 ThreadID:2
i=1j=0 Threads:8 ThreadID:0
I=0 Threads:8ThreadID:0
I=1 Threads:8ThreadID:1
是否支持并行嵌套:1
计算耗时:0.0338853s
从上面结果可见,不仅在i的循环中每个循环处于并行,在j中每个循环也处于并行状态。默认情况下,程序的并行嵌套是不可用的,即并行中的并行将会当作串行来处理。如果使用omp_set_nested()设置其可用并行嵌套,则当并行中的线程遇到新的并行时,会创建新的线程来并行处理。
下面用一个例子来比较嵌套并行与非嵌套并行的运行效率,代码如下:
上面代码是一个嵌套并行,其计算耗时约为2.63688s。如果将j循环上面的并行指令注释,只有一个并行结构,其结果为0.678552s。如果将i循环上面的并行指令注释,保留j循环前面的并行指令,其结果为2.67237s。如果都不采用并行,直接用串行运行,其计算耗时为16.1329s。可以,采用嵌套并行并不一定能提高效率,只有在合适的地方设置并行才能达到事半功倍的效果。
分享到:
相关推荐
嵌套并行例子,c语言程序,Linux操作
本教程说明了如何使用OpenCL:trade_mark:2.0的两项强大功能:enqueue_kernel函数,该函数使您可以从设备以及work_group_scan_exclusive_add和work_group_scan_inclusive_add入队内核
七、嵌套并行 29 八、OpenMP中的常用函数 33 1、设置线程数目 33 2、获取线程数目 33 3、获取最多线程数目 33 4、返回线程ID 33 5、获取程序可用的处理器数目 33 6、获取时间 34 7、是否处于并行中 34 九、同步 35 1...
在现有并行识别方法无法做到较好的负载均衡时,选择嵌套循环的多个维进行并行,将多个并行维的迭代空间合并后再作任务划分,减少负载不均衡对程序并行效率的影响。此方法在已开发的自动并行化系统中进行了实现,实际...
OpenMP并行计算例子,主要包括简单例子、并行循环、常用函数、分段并行、嵌套并行、求π以及同步这些例子。所有例子都已经过测试。
大数据-算法-嵌套结构并行多维动态规划算法及其应用研究.pdf
基于OpenMP适当分解循环体,得出小波包嵌套与非嵌套并行算法,并将这些算法应用于电力系统海量数据压缩。与串行小波包算法的耗时比较表明,并行算法的速度可以达到接近串行算法的2倍,显著提高了小波包在电力系统...
包含常用的源码例子,不错;并行循环,常用函数,分段并行,嵌套并行,求Pi,同步
一种面向众核处理器的嵌套循环多维并行识别方法.pdf
嵌套分割算法是一种新的系统优化计算方法,它可以应用于确定型和随机型、离散系统和连续系统的优化问题。综述了嵌套分割算法的概念原理、方法步骤,介绍了算法的应用情况,并探讨了算法未来的研究方向。
近年来,由于频率墙和功耗墙的存在,计算机计算性能的提升主要依赖于计算核心数量的增加,这使得传统的串行算法设计逐步转向基于多核和众核的并行算法设计,越多越多的应用领域,特别是人工智能领域需要并行数据结构...
在涉及嵌套并行性的工作负载中,对底层线程池大小的精细控制可能很有用,从而减轻了超额预订的问题。安装对于用户,请从PyPI安装最新发布的版本: pip install threadpoolctl 对于贡献者,以开发人员模式从源存储库...
行业分类-设备装置-一种基于嵌套滑动窗口和遗传算法的并行处理方法
感测器 由 Stefano Martiniani 和 Jacob Stevenson 编写的叠加增强嵌套采样 (SENS) 的高度模块化并行实现。 该算法的完整描述可免费获得。 此软件包需要以下软件包: 嵌套采样: :
结合波动方程数值模拟中的多层循环嵌套问题和OpenMP的特点,通过确定循环体并行顺序、减少串行环节、合并循环体、准确设置制导语句以及线程绑定优化等方法有助于实现微机多核的高效并行。针对波动方程特点的多核并行...
在业务中,嵌套for循环的使用常常导致性能瓶颈,尤其是在处理大数据集时。以下是一些建议,用于优化业务上需要使用的嵌套for循环: 减少循环次数: 尽量避免不必要的循环。在循环开始前,先检查是否可以提前终止...
采用计算任务量大小的方法,解决了在紧嵌套循环自动并行化过程中存在循环并行化的并行粒度确定问题以及循环自动并行化中数据划分的数据访问局部性问题,在多核系统中实现了紧嵌套循环自动并行化时的数据访问局部性方案...
该包超越了提供以下方法的裸露实现: 单个计算节点上的内置并行化(单台机器上的最大 CPU 线程总数) 通过分布式计算内置基于 Pyro4 的并行化,非常适合在集群上或跨网络运行计算能够保存并从检查点二进制文件重新...
该软件包提供类似于scikit-learn的嵌套交叉验证,但使用消息传递接口(MPI)进行并行计算。 要求 0.16.0或更高版本 例子 from mpi4py import MPI import numpy from sklearn . datasets import load_boston from ...