oneAPI 提供了 DPCT 工具来移植 CUDA 程序,官方称可以移植 95 %的 CUDA 程序。实际体验下来,在自动生成的代码有一些小的语法上错误,需要做一些修正才可正常使用。暂时感觉 AMD 的 hipify 转出来的程序需要修改的内容更少。毕竟 C 语言转 C++ 难度挺大的。可以通过以下途径获取和安装 DPCT:
单个文件时,对 CUDA 程序进行迁移十分的简单,只需要输入下面的命令行即可完成迁移:
dpct --in-root=. src/<cuda_source_code>.cu --cuda-include-path=<path>/cuda/include
其中cuda_source_code
文件为需要转换的 CUDA 程序。--cuda-include-path
后加 CUDA 头文件的路径。
在实际的 CUDA 项目开发中,一般都是通过 Makefile 或者 CMake 来管理工程。DPCT 同样也支持直接对上述方式管理的 CUDA 工程进行移植。不用用户一个一个的将 CUDA 程序进行迁移。
第一步:intercept
使用 DPCT 内置的 intercept-build 指令,可以自动的生成 DPCT 所能支持 compile_commands.json
文件,方便 DPCT 进行转化。
make clean
intercept-build make
在当前文件假下会生成 compile_commands.json
文件。
倘若当前项目已经构建完成了,需要先执行make clean,否则会无法移植。
第二步:使用 DPCT 进行移植
使用DPCT的-p
选项和第一步生成的compile_commands.json
文件来将 CUDA 程序转为 DPC++ 程序。
dpct --in-root=. -p compile_commands.json --cuda-include-path=<path>/cuda/include
以 cuda 经典入门程序 VectorAdd 为例。
首先使用intercept-build make
来生成compile_commands.json
,再用dpct
生成相对应的 oneAPI 代码。在我的环境下输入如下指令即可:
intercept-build make
dpct --in-root=. -p compile_commands.json --cuda-include-path=/opt/cuda/include
需要根据自己环境配置路径
先使用 cmake 指令生成相应的 Makefile 文件,其余步骤与上一章节相同。
CUDA | thread | wrap | block | grid |
---|---|---|---|---|
DPC++(oneAPI) | work item | sub group | work group | nd range |
OpenCL | work item | sub group | work group | nd range |
CUDA | shared | Unified Memory | _syncthreads |
---|---|---|---|
DPC++(oneAPI) | local | Unified Shared Memory | barrier |
OpenCL | local | Unified Shared Memory | barrier |
头文件
所有 CUDA helper头文件,oneAPI 暂时不支持,当然,也可以直接将相应的 helper 代码复制到工程中来,从而使得 DPCT 将其转化为 DPC++代码。
#include <helper_functions.h>
#include <helper_strings.h>
#include <helper_cuda.h>
...
API
因为 CUDA 和 DPC++ 的编程模型和风格的不同,导致了 DPC++ 缺失一部分的 API。但是,总体都有相应的替换方法。
//CUDA
checkCudaError(...);
//cublas
cublasCreate(...);
cublasDestory(...);
此处关于第一个API,有一个很好的移植方法,就是使用
try{...} catch(...){exit(-1)}
的方法对要检测的内容进行包裹。
本文发布于:2024-02-02 03:27:29,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681679841077.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |