欢迎光临散文网 会员登陆 & 注册

自编教材分享:第九章—向量化指导命令

2023-12-04 09:18 作者:先进编译实验室  | 我要投稿


向量化指导命令

OpenMP指导语句中有两种支持向量化语句,分别为#pragma omp simd和#pragma omp for simd。其中#pragma omp simd指导语句对循环进行向量化是单线程的数据级并行,而#pragma omp for simd结合了for和simd两个指导命令同时进行并行化和向量化,具体是既将所有迭代的计算任务分配给各个线程,又进一步将每个线程执行的计算任务进行向量化。

如图所示,OpenMP使用2个线程在128位寄存器上对4个单精度数进行加法计算,在串行执行时,只能使用1个线程计算一次加法运算,其余线程则处于空闲状态;在并行执行时,使用2个线程,每个线程执行一次加法运算;在向量化执行时,只能使用1个线程,但这1个线程内可以使用SIMD单元进行4次加法运算;在并行向量化执行时,除了使用全部2个线程之外,每个线程还可以计算4次加法运算,并行区一共计算8次加法运算,可明显提升程序的性能。

与指导命令simd配套的子句中,aligned用于数据的对齐;collapse用于循环嵌套的合并调度;部分子句lastprivate、linear、private和reduction用于设定子线程或SIMD通道的数据共享变量,其中SIMD通道是指在指定向量长度的寄存器上可同时处理的数据个数;子句linear(list[ : linear-step])表示变量列表中的变量xi对于每次迭代而言是私有的,它与循环迭代次数i之间存在线性关系xi=x0+i*step,step的值在执行simd结构期间不变,默认为1;其它子句如simdlen和safelen用于设定向量长度限制,子句safelen(length)通过限制程序的向量长度来维持循环依赖,从而保证运行结果的正确性,其中length为在不打破循环依赖情况下支持并行执行循环迭代的最大数目;子句simdlen(length)用于指定向量长度为length,即向量化后每次迭代执行的运算相当于未向量化时执行n次,其中n必须是2的幂。

除直接使用simd指导语句外,OpenMP还能在各个循环之间没有依赖的前提下,采用for simd复合指导语句同时进行并行化和向量化,这时每个线程能够充分利用处理器核心进行数据级并行,进一步提升程序的性能。for simd指导语句的语法方法如下,由于其由指导命令for和simd组合而来,因此其配套子句为这两个指导命令配套子句的并集。

simd 指导语句

for simd 指导语句

相较于程序的串行执行,添加simd指导语句进行向量化操作后,由系统SIMD单元长度为256bit支持8个浮点型数据同时运算可知,理论上加速比能够达到8,但实际测试得到程序加速比达到了14,在仅添加-O3选项编译测试后,发现这是因为使用-O3编译选项的同时开启了其他隐含的编译优化,使得程序的性能又获得了进一步提升。


自编教材分享:第九章—向量化指导命令的评论 (共 条)

分享到微博请遵守国家法律