刘素芹,王 鑫,安仲奇,杨娜利,王俊爽
(中国石油大学计算机与通信工程学院,山东青岛 266580)
近年来由GPU作为加速部件的异构计算系统和技术,如CUDA[1]产生并得到发展。GPU擅长的SIMD(single instruction multiple data)执行方式提高了系统的计算效率,但当程序出现条件分支分歧时,会部分或完全退化成串行执行,性能损失严重。条件分支是控制程序执行流的基本方式,易大量出现,并且算法越复杂,对分支的利用就会越频繁。因此,需要优化GPU对条件分支的处理以更充分地发挥其并行计算的潜力。目前的研究主要集中在硬件层面设计线程调度器方面[2-5],对普通用户而言实现难度较大,而利用现有体系结构从软件层面优化条件分支处理流程方面的研究还较少,因此笔者探索实现难度较低、可操作性较强的优化方法。
基于CUDA的GPU执行没有分支的语句时,线程束(warp[6])中的线程按照SIMD的方式步调一致地执行,而遇到条件分支分歧时,处理过程则有所不同。对于较简单的IF-ELSE语句,PTX[7]汇编器将PTX语句只编译为GPU断言指令。此时GPU的断言设置指令处理IF语句的条件部分,并根据判断结果设置断言寄存器的各位,从而启用或禁用对应的SIMD道。当执行IF内部的语句时,操作被广播至所有SIMD道,但只有断言寄存器设为启用的道执行操作并流出结果,设为禁用的道并不执行操作也不保存结果。ELSE部分处理方式与之类似。分支语句执行结束后,SIMD道不再受断言影响,继续一致地执行后续指令。……