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.
(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.
相关文章推荐
- 实现 iOS 应用自动编译
- 用ruby实现latex自动编译
- OpenLayer+PostGIS+GeoServer--无额外后台实现地理分析与查询框架
- Eclipse编译JNI时提示"Fatal: Unable to open makefile"解决办法
- 通过按钮控件实现MDI新建子窗口(MFC自动生成的视图、文档、子框架共用)
- 基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架 推荐
- undefined reference to `libiconv_open 无法编译PHP
- .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- PullToRefreshGridView实现上拉加载和下拉刷新,使用Volley框架解析数据
- OpenLayer+PostGIS+GeoServer--无额外后台实现地理分析与查询框架
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- php编译时undefined reference to `libiconv_open'解决办法
- 编译php7.0.17报错提示 undefined reference to `libiconv_open'
- undefined reference to `libiconv_open 无法编译PHP
- Unity3D通过预编译指令实现分平台编译(翻译)
- undefined reference to `libiconv_open 无法编译PHP
- 一种基于网络服务的客户端自动升级框架及其应用
- 消息框架的一种实现
- Kilim 简介 一种用于实现 Java 并发性的角色框架
- 项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】