关于写一篇有关DPC++博客来完成上机作业这件事

纯纯老师的任务罢了,如有出错还请见谅

一、什么是DPC++

DPC++是Data Parallel C++(数据并行C++)的首字母缩写,它是Intel为了将SYCL引入LLVM和oneAPI所开发的开源项目。SYCL是为了提高各种加速设备上的编程效率而开发的一种高级别的编程模型,简单来说它是一种跨平台的抽象层,用户不需要关心底层的加速器具体是什么,按照标准编写统一的代码就可以在各种平台上运行。可以说SYCL大大提高了编写异构计算代码的可移植性和编程效率,已经成为了异构计算的行业标准。

二、环境配置

DPCPP的实践环境有3种选择

1、基于Intel DevCloud环境

2、Dpcpp编译器的本地安装

3、基于Docker的环境

本博客主要介绍前两种,第三种会附上下载网址供读者自行研究

2.1、基于Intel DevCloud环境

请在浏览器中访问下列快捷网址https://idzcn.com/devcloud.htm,或直接访问账户注册页面https://www.intel.com/content/www/cn/zh/secure/forms/devcloud/enrollment.html开始注册一个新的Inter用户账号。

(1)、点击“Create an Account”开始创建一个全新的Inter账号

(2)、填写基本信息

 

(3)、在弹出的新页面输入邮箱中收到的Inter验证码,如果经过一段时间尚未收到激活邮件,请检查垃圾邮件或在本页下方点击“Send new code”重新发送验证邮件。 

 (4)、请填写“企业或机构名称”并在下拉菜单中选择您的用户类型。

(5)、点击”我接受“

 

 (6)、点“下一步”

(7)、点击“提交”

 

 (8)、创建成功,等待系统自动跳转到账号激活步骤进行账号激活。如果系统未能自动跳转,请点击POST data进行账号激活。

(9)、激活完成,系统会跳转到Inter Developer Cloud主站。点击主站右侧oneAPI相关服务的连接 ,跳转 进入 DevCloud for oneAPI 专项服务的登录页面。如果系统未能自动跳转,请点击https://devcloud.intel.com/oneapi 访问该页面。

(10)、在DevCloud for oneAPI专项服务页面中,点击右上角或页面中的“Sign In ”连接,输入完成登录

(11)、 如果是首次登录 oneAPI 专项服务页面,请阅读“Intel DevCloud Access and Software License Agreement”及“Colfax Service Terms”相关协议条款,勾选“I accept these terms”(我同意这些条款),点 击“Submit”进递交表单。登录进入专项服务。

(12)、 用户可以通过点击网页左侧“Get Started”进入该选项的页面,在“Get Started”选项页面中, 用户可以 通过点击页面最左下角 Connect with Jupyter* Lab 中的“Launch JupyterLab*”按钮直接启动 Jupypter 服 务。

(13)、 启动 Jupyter 服务的过程中,系统可能会再次提示确认登入信息,并开始部署并启动相关远程服务。 其中可能会有若干次系统显示的部署进展提示信息。

(14)、Jupypter 服务启动完成后,请选择将缺省的 Python3 作为当前运行的核心,其他的运行核心选项可以 根据实际项目的需要予以选择或切换。

2.2、Dpcpp编译器的本地安装

 下载地址:Releases · intel/llvm · GitHub

(1)、下载最新版本,自己选择目录解压(例如,C:/opt)

(2)、把llvm编译器的bin目录添加到系统环境变量PATH(如C:/opt/dpcpp_compiler/bin)。不知道怎么添加系统环境变量的读者建议自己百度学习一下。

ps:本方法仅支持CPU是Inter的电脑,如果不是建议直接在DevCloud下学习运行

2.3、Dpcpp编译器,docker环境

下载地址:llvm/DockerBKMs.md at sycl · intel/llvm · GitHub

 三、示例代码本地运行(基于Inter DevCloud)

1、Hello World,一个基本的for循环并行化示例

%%writefile lab/test.cpp
#include <sycl/sycl.hpp>
#include <iostream>
using namespace sycl;

const std::string secret {

"Ifmmp-!xpsme\"\012J(n!tpssz-!Ebwf/!"
"J(n!bgsbje!J!dbo(u!ep!uibu/!.!IBM\01"};

const auto sz = secret.size();

int main(){
queue Q;
char *result = malloc_shared<char>(sz, Q);
std::memcpy(result, secret.data(), sz);
Q.parallel_for(sz, [=] (auto &i) {
result[i] -= 1;
}).wait();
std::cout << result << "\n";
return 0;
}

编译并运行

2、DPC++设备选择方式1:默认的设备选择器

%%writefile lab/demo_fig2_7.cpp
#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;
int main(){
    queue Q;
    std::cout << "Selected device: " <<
    Q.get_device().get_info<info::device::name>() << "\n";
    
    return 0;
}

编译并运行

此时输出的是默认的设备

3、DPC++设备选择方式2:使用host_selector

老版本的sycl支持host_selector,到2020年版本被弃置,无法运行,这里仅附上代码

%%writefile lab/demo_fig2_9.cpp
#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;

int main(){
    queue Q{ host_selector{} };
    std::cout<< "Selected device: " <<
        Q.get_device().get_info<info::device::name>() <<"\n";
    std::cout << " -> Device vendor: " <<
        Q.get_device().get_info<info::device::vendor> () <<"\n";
    
    return 0;
}

有兴趣的读者可自行寻找老版本的sycl下载运行试验一下

4、DPC++设备选择方式3:使用cpu_selector

%%writefile lab/demo_fig2_10.cpp

#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;
int main(){
    queue Q ( cpu_selector_v );
    std::cout << "Select device: "<<
    Q.get_device().get_info<info::device::name>() << "\n";
    std::cout <<" -> Device vendor: " <<
    Q.get_device().get_info<info::device::vendor>() << "\n";
    return 0;
}

编译并运行,结果如下

 显示出cpu设备选择器。

5、DPC++设备选择方式4:使用多个selector

%%writefile lab/demo_fig2_13.cpp
#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;
 
int main(){
        queue my_default_queue(default_selector_v);
        queue my_accelerator_queue(accelerator_selector_v);
 
        std::cout << "Selected device 1:" << my_default_queue.get_device().get_info<info::device::name>() << "\n";
        std::cout << "Selected device 2:" << my_accelerator_queue.get_device().get_info<info::device::name>() << "\n";
 
        return 0;
}

编译并运行,结果如下

代码中的accelerator_selector_v为选择一个加速器设备(如 FPGA、ASIC 等);default_selector_v为选择最佳的可用设备,优先选择 GPU 或加速器设备,如果没有则选择 CPU 设备。

6、向数组中填充数据

%%writefile lab/demo_fig2_14.cpp
#include <CL/sycl.hpp>
#include <array>
#include <iostream>
using namespace sycl;
 
int main(){
        constexpr int size = 16;
        std::array<int,size> data;
        buffer  B {data};
 
        queue Q{};
        std::cout << "Selected device is : " << Q.get_device().get_info<info::device::name>() << "\n";
 
        Q.submit([&](handler& h){
                                accessor acc{B,h};
                                h.parallel_for(size,[=](auto&idx){
                                                        acc[idx] = idx;
                                                });
                        });
        return 0;
}

 这是一个使用SYCL编写的向数组中填充数据的程序。SYCL提供了一种可以在CPU和GPU等不同设备上运行的单一编程模型,程序员可以使用SYCL的API定义工作项和工作组,并将数据传输到设备。这里,程序创建了一个std::array<int,size>类型的数组并将其绑定到一个buffer对象B上。接着创建了一个SYCL队列Q,并使用parallel_for方法进行并行计算,通过访问器accessor读写缓冲区B中的数据,最终将[id] = id填充到数组中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值