在 OpenCL 上使用 OpenACC?
Posted
技术标签:
【中文标题】在 OpenCL 上使用 OpenACC?【英文标题】:Use of OpenACC over OpenCL? 【发布时间】:2013-01-15 08:42:42 【问题描述】:我是 OpenACC 的新手,它是 GPU 加速和 CPU 的新编程标准。据我所知,OpenACC 是一种编译器指令语言,我们可以直接在任何我们想要的地方加速代码,而无需更改整个代码。与 OpenMP 不同,此编程标准也适用于 GPU。
现在我的疑问在这里提出......
我们有用于加速的 OpenCL,现在是 OpenACC(它非常易于使用,只需提供编译器提示即可)。对于宿主程序加速,我们可以简单地放置编译器指令,那么如果我们有内核呢?即现在我想为 GPU(c 语言)编写我的代码,我必须做什么?像 OpenCL 一样,我需要编写 example.c 和 example.cl 吗?那么需要添加OpenACC编译指令吗?或者以哪种方式?如果是这样,那么在这里使用 OpenACC 有什么用,因为我们正在编写 *.c 和 *.cl 文件,(我们需要检查所有内存限制以及所有用于编写 OpenCL 的内容,这是一项艰巨的工作)。
【问题讨论】:
有 3 个级别需要考虑:1) OpenCL 是低级的,自己编写的加速器并行性,2) OpenCL 库更易于使用,基于 OpenCL,手写到实现加速器并行性,3) OpenACC 依赖编译器以某种方式自动在您的代码中找到加速器并行性。在实践中,编译器无法为大多数问题自动查找并行性。我们去年写过这个话题:blog.accelereyes.com/blog/2012/04/11/… 如果您还没有找到它,您可以考虑调查OpenACC 的“教育”和sample code 部分 【参考方案1】:实际上,OpenACC 很像 OpenMP,但针对的是 GPU 等加速设备。不是让 OpenMP #pragma parallel for
为多线程 CPU 并行化循环,OpenACCs #pragma acc kernels
会将包含的循环转换为在 GPU 上执行的内核函数。现在必须手动完成的大部分工作(例如,将数据从设备传输到设备)都被编译器隐藏了。因此,您没有两个单独的编译单元。
现在这是 OpenACC 的问题,我对为什么现在采用率非常低的回答是:没有来自 GCC 或 Clang 的支持。当然也有来自 PGI 和 CAPS 的商业解决方案,但如果没有这些其他编译器,您会疏远许多用户。
【讨论】:
非常感谢您的回答..我的疑问得到了澄清..我想在这个 OpenACC 上探索更多..我研究了一些关于这个的 pdf 和文档..我想学习更多,你能提供我最好的学习资源吗? 不幸的是,除了您可以从官方网站获得的信息之外,没有更多可用信息。这也可能归因于 OpenACC 的低采用率。 GCC 可能会在 4.9 中取得进展 导师图形是working on it【参考方案2】:更新:gcc6 现在部分工作:
“GCC 6 发布系列包括一个大大改进的 OpenACC 2.0a 规范实现。”
见https://gcc.gnu.org/wiki/OpenACC
【讨论】:
【参考方案3】:更新(2020 年 8 月):
GCC supports OpenACC up to version 2.6 in GCC 10 可以针对 nVidia PTX、AMD GCN 和 Intel MIC(至强融核产品)。这意味着支持所有最新的 nVidia 和 AMD Radeon 卡 Clang (LLVM) 似乎有 some experimental support【讨论】:
【参考方案4】:更新:GCC6 + 7 积极集成 OpenACC 规范
见https://gcc.gnu.org/wiki/OpenACC
【讨论】:
以上是关于在 OpenCL 上使用 OpenACC?的主要内容,如果未能解决你的问题,请参考以下文章