您的位置:首页 > 运维架构

OpenMP to GPGPU:一种实现自动翻译和调优的编译框架[1]

2014-04-13 15:49 253 查看
也算是源到源自动调优的一篇经典之作吧。Motivation还是实现自动调优减低程序员码代码的困难性,作者做的这个编译器主要流程是针对一个OpenMP程序:

(1)OpenMP Stream Optimizer---识别出所有的循环,用了两种技术提高线程间的数据局部性(通俗点来讲就是对循环做一些预处理使得global memory可以coalesced):一、循环交换(loop-swap),对于嵌套的循环,可能外层的循环下标只在多维数组的高维,这样的话相邻线程读的数据就不相邻了,编译器先检测了如果循环内外层交换后不影响结果的前提下对循环内外层进行交换,交换后相邻线程读的数据就相邻了(coalesced);二、循环瓦解(loop-collapsing
),对于一个不规则程序(数据不coalesced,线程间不能SIMD),编译器将原循环中抽取数据可以coalesced线程可以SIMD的一部分出来单独算(提高一部分的效率)。

(2)Baseline Translator---源到源翻译,将(1)对循环部分优化过的OpenMP程序信息毫无保留地翻译到CUDA代码。重点是识别OpenMP制导语句的所有信息然后转换到对应的CUDA kernel。

(3)CUDA Optimizer---提出了三种对CUDA kernel上做优化的方法:一、利用到GPU硬件上的快速存储部件,检测kernel计算时需要的数据类型然后用相应的快存单元(shared memory,texture,register...)去cach这些数据;二、对于threadprivate array的处理可以用矩阵置换来实现coalesced;三、在(2)阶段时翻译器是将kernel中所有用到shared
memory的数据都显式地从CPU拷进GPU然后再从GPU拷出CPU,但是实际上不需要全部都这么处理,编译器通过一种data flow anaysis的方法检测出真正需要显式CPU-GPU端传输的数据,减少了CPU-GPU的IO。

最后的实验也是做得非常好,选了两类很有代表性的程序:规则和不规则的各两个。实验的结果表示优化的效果非常好,而且作者对实验的现象进行了很详细的分析。看来论文好实验得做得很深入和分析的很全面才行。

参考:

[1] Lee S, Min S J, Eigenmann R. OpenMP to GPGPU: a compiler framework for automatic translation and optimization[J]. ACM Sigplan
Notices, 2009, 44(4): 101-110.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐