Intel DPC++安装与使用
Intel DPC++安装与使用
DPC++(Data Parallel C++)是Intel公司使用oneAPI实现的SYCL和SYCL编译器,这里记录一下V100服务器安装DPC++过程
下载安装DPC++编译器
前往官网下载地址,左侧选择Compilers->Intel® oneAPI DPC++/C++ Compiler and Intel® C++ Compiler Classic,选择目前最新的离线版本下载。
使用chmod +x
授予执行权限,然后用./
命令开始安装,这里如果用sudo权限安装会安装到/opt/intel/oneapi文件夹下,如果用普通用户权限安装会安装到/home/username/intel/oneapi目录下。
由于新版本DPC++没有在Ubuntu 18.04系统上测试过,安装过程中可能会出现警告,直接无视。
安装完成后需要设置变量,以普通用户安装为例,直接运行source /home/username/intel/oneapi/setvars.sh intel64
,注意每次启动终端都要设置一次。
编译运行DPC++程序
设置完成后就可以使用icpx编译DPC++程序,编译时需要加上-fsycl命令,例如以下代码运行了一个简单的sycl程序,并打印了所有支持的设备。需要注意的是sycl 2020语法与sycl 1.x语法有很大差距,DPC++默认支持sycl 2020语法,使用旧版本语法将会报错。
using namespace sycl; | |
int main() | |
{ | |
constexpr int size = 16; | |
std::array<int, size> data; | |
queue Q; | |
buffer B { data }; | |
Q.submit([&](handler& h) { | |
accessor A(B, h); | |
h.parallel_for(size, [=](auto& idx) { | |
A[idx] = idx; | |
}); | |
}); | |
host_accessor A { B }; | |
for (int i = 0; i < size; i++) { | |
std::cout << "data[" << i << "]=" << A[i] << "\n"; | |
} | |
for (auto const& this_platform : platform::get_platforms()) { | |
std::cout << "Platform: " << this_platform.get_info<info::platform::name>() << std::endl; | |
for (auto const& this_device : this_platform.get_devices()) { | |
std::cout << "Device: " << this_device.get_info<info::device::name>() << std::endl; | |
} | |
} | |
return 0; | |
} |
运行命令icpx -fsycl test.cpp
编译代码,然后./a.out
执行,输出运行结果。
安装CUDA插件
DPC++默认不支持CUDA,需要下载安装CUDA插件才能在英伟达GPU上运行,参考文档oneAPI for NVIDIA® GPUs。
首先下载CUDA插件,下载地址Downloads-oneAPI for NVIDIA GPUS,oneAPI版本选择已经安装过的DPC++版本,这里版本一定要一致,否则会找不到安装路径。CUDA版本需要选择当前oneAPI支持的CUDA版本。
下载后同样用chmod +x
授予执行权限,然后用./
命令执行,插件安装完成后就可以在DPC++中使用英伟达GPU了,编译使用GPU的DPC++程序需要添加编译选项-fsycl-targets=nvptx64-nvidia-cuda
卸载DPC++
重新运行安装脚本,会出现卸载选项,选择卸载选项卸载即可,卸载完成后可以删除intel文件夹。
DPC++和SYCL教程
主要看了下面两个教程
-
Data Parallel C++,中文译本地址Data Parallel C++中文版,这本书写于SYCL 2020标准发布之前,所以有些语法跟SYCL 2020有些不一致,需要参考其他文档修改
-
SYCL 2020 Specification,标准SYCL规范,比起说明书更像是一个教程,也可以用来入门
除了DPC++还有其他SYCL编译器实现,比如OpenSYCL(之前叫hipSYCL)、ComputeCpp、triSYCL等,感觉不同的SYCL编译器实现方式有很大不同,语法和编译方式也有一些区别,相比之下还是DPC++文档和教程更多一些。
本文来自博客园,作者:zhuwlong,未经授权禁止转载