相关介绍&体验
- 为什么会接触到oneApi呢?
- 原来是北大软微的C编程训练课和Intel一起上课啦,校企两开花
- DevCloud提供了一个运行代码的环境,可以运行C++代码
- 这个环境可以使用oneAPI的异构运算功能
- 界面也是很方便,应该是基于Jupyter Notebook
- 所谓的异构运算功能,其实就是除了cpu之外还可以调用gpu进行并行运算
实战环节
-
这次的课程一共提供了三个课后作业供我们选择(使用DPC++类完成)
- DPC++简单来说就是oneApi这边提供的C++异构运算的库
-
这三个作业分别:
- 交叉熵运算
- 实际相应的gpu程序、与cpu计算结果误差绝对值在0.001之内
- 卷积计算
- 使用卷积对图像进行边缘检测
- 算法研究-topK
- 从一系列数据内,找出最大或者最小的k个元素
- 交叉熵运算
-
笔者选择了交叉熵运算这个作业
让我们来对这次作业中需要使用到DPC++类里面的一些方法进行简介:
1. malloc方法
- 我们都知道普通C++里面有malloc方法用于分配内存空间,那么在不同的设备上,DPC++又是如何分配呢?
- 使用malloc_host就是在host上分配内存
- 使用malloc_device就是在device(比如说gpu)上分配内存
- 使用malloc_shared就是在host和device上分配一个共享空间
2. 设备队列和选择器
- 我们需要选择一个适合的gpu进行运算,可以使用以下语句生成一个队列
- queue my_gpu_queue(gpu_selector{} , propList)
- 其中propList就是propertyList当前可用设备的意思,详细可查阅其他资料
3. 提交任务到gpu
- 当上述的事情都做好了之后,我们要做的事情就剩下提交任务到gpu了
- 使用queue.submit即可提交任务到gpu,以下是一个例子
auto e = q.submit([&](handler& h) {
h.parallel_for(range{K * N} , [=](auto& idx) {
int row = idx / N ;
int col = idx % N ;
float exp_sum = 0.0;
for (int i = 0; i < M; ++i) {
exp_sum += exp(X[row * M * N + i * N + col]);
}
int mask_id = mask[row * N + col];
loss[row * N + col] = weight[row * N + col] * log(exp(X[row * M * N + mask_id * N + col]) / exp_sum);
});
});
到此,作业便完成得七七八八了,下面是一个运行结果。
不得不说oneApi平台还是挺好用的,不用在自己电脑上跑gpu,好评!
感想
- oneApi打开了我对异构运算探索的大门,尤其是使用C++进行编程。
- 希望可以多来点校企两开花的课程,感谢Intel!