英特尔oneApi—DPC++初体验

相关介绍&体验

  • 为什么会接触到oneApi呢?
    • 原来是北大软微的C编程训练课和Intel一起上课啦,校企两开花
  • DevCloud提供了一个运行代码的环境,可以运行C++代码
  • 这个环境可以使用oneAPI的异构运算功能
    • 界面也是很方便,应该是基于Jupyter Notebook
    • 所谓的异构运算功能,其实就是除了cpu之外还可以调用gpu进行并行运算

实战环节

  • 这次的课程一共提供了三个课后作业供我们选择(使用DPC++类完成)

    • DPC++简单来说就是oneApi这边提供的C++异构运算的库
  • 这三个作业分别:

    1. 交叉熵运算
      • 实际相应的gpu程序、与cpu计算结果误差绝对值在0.001之内
    2. 卷积计算
      • 使用卷积对图像进行边缘检测
    3. 算法研究-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!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值