【高性能计算】OneAPI入门

简介: 【高性能计算】OneAPI入门

👉引言💎


学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 热爱写作,愿意让自己成为更好的人............

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉


2.0 概述


OneAPI参考手册

OneAPI是一个基于标准统一的 软件堆栈,解决了CPU与GPU硬件层面上的差异性,提供了一种统一的异构计算编程模式


image.pngimage.pngimage.png


  • oneAPI核心库


image.png


  • 工具包内容示例:


image.png

推荐使用icx(OneAPI DPC++/C++ Compiler) / fx (Fortran Compiler)  编译器(两者都支持CPU与GPU编程)

  • OneAPI HPC开发工具包
    同时 DPC++ 兼容性工具 可以协助开发者一次性 代码迁移(从Cuda到DPC++),提高了代码的可移植性
  • 接入oneAPI 开发环境
  • Jupyter 方式的接入和使用环境
  • 传统 SSH 终端方式接入
  • VSCode 通过配置 SSH 方式接入
  • RDP 方式接入(仅限于使用 oneAPI 渲染工具套件等相关组件)

image.png

这里通过jupyter的方式接入devcloud

  • 图为devcloud的工作流程以及结构
    image.png
    除了使用oneAPI外,这里还提供了常用的深度学习框架接口,

image.png


2.1 OneAPI 异构计算编程模式


通过构建运行测试样例来 检验以上配置是否成功

image.png

  • 代码分析
  • queue的目的是指定工作的目标位置(一个队列只能映射到一个设备,但多个队列可以映射到同一个设备),函数模板malloc_shared分配了可在设备上使用的工作内存
queue q;
int *data = malloc_shared<int>(N, q);
  • image.png
  • IntelGPUSelector d;是一个继承了device_selector的设备选择器,device_selector是一个纯虚类,其中的操作符()重载函数为纯虚函数,需要子类实现,该函数遍历计算机上的计算设备,并且返回使用设备的优先级
  • parallel_for执行并行计算,而free并不是C库的free(释放指针),而是sycl中的free, [=] (id<1> i){}为lambda表达式,以值传递的形式 调用id对象
q.parallel_for(range<1>(N), [=] (id<1> i){
    data[i] *= 2;
  }).wait();
  ...
 free(data, q);
  • DPC++运行时包含现代C++的类,模板以及库
  • 应用范围和命令组范围均支持C++的所有功能
  • 内核范围支持的C++有部分限制


2.2 编程模型


  • 平台模型
    主机控制多个设备进行操作,执行程序的主要部分是应用范围以及命令的范围。每一个设备包含多个计算单元,可以并行执行。每个计算单元包含多个处理元素,充当单独的计算引擎

image.png

  • 执行模型指定如何在加速器上完成计算,通过命令组(内核调用,访问器accessor等)协调主机与设备之间的执行和数据管理。内核外的代码控制并行度,具体的工作数量和分配由ND-range与工作组规格决定
  • 基本并行内核是实现 for-loop并行化的简便方法,但不允许在硬件级别进行性能优化
  • ND-Range内核是另一种表示并行性的方法,通过提供对本地内存的访问以及将执行映射到硬件上的计算单元实现底层性能调整

image.png

  • 内存模型
    协调主机和设备之间内存的分配和管理, 通过声明内存对象 (缓冲器和图像) 来指定内存。这些内存对象通过访问器accessor在主机和设备之间进行交互,访问器传达期望的访问位置(如主机或设备)和特定的访问模式(如读或写)

image.png


2.3 实验理解


  • nd_range<1>(range<1>(N),range<1>(n))迭代空间
  • buffer封装在SYCL中实现数据的跨设备共享,但是并不是数据的直接储存空间,储存空间由访问器accessor提供
  • 并行执行的for循环如parallel_for所示,其中item可以表示内核函数的单个实例,可以查询更多实例属性
  • code中并没有直接将数据返回到主机的操作,猜想 本地数据out_vect(DpcppParallel函数中)的得到是因为  起初 给out_vect 绑定了一个buffer, 设定为主机与设备间的数据共享,后续使用accessor v3进行数据写入后,在主机端读取out_vect就可以得到设备端的数据
  • 实际上是:当函数执行完毕后 buffer会调用析构函数,此时会放弃数据所有权,并将数据复制回主机内存
  • host_accessor 使用主机缓冲区访问目标的访问器,在命令组范围之外创建,可以访问数据同步到主机
  • 函数大致流程
void DpcppPal (queue&q, vector< >& T1){
    std::cout << "Target Device: "<< q.get_device().get_info<info::device::name>() << "\n";
    buffer b1(T1);
    q.submit([&](auto & h){
        accessor V1(b1,h,read_only(write_only));
        h.parallel_for(range<1>(n),[=](auto i){
        })
    })
    q.wait_and_throw();
}
  • 自定义选择器
class my_device_selector : public device_selector {
public:
    my_device_selector(std::string vendorName) : vendorName_(vendorName){};
    int operator()(const device& dev) const override {
    int rating = 0;
    //We are querying for the custom device specific to a Vendor and if it is a GPU device we
    //are giving the highest rating as 3 . The second preference is given to any GPU device and the third preference is given to
    //CPU device.
    if (dev.is_gpu() & (dev.get_info<info::device::name>().find(vendorName_) != std::string::npos))
        rating = 3;
    else if (dev.is_gpu()) rating = 2;
    else if (dev.is_cpu()) rating = 1;
    return rating;
    };
private:
    std::string vendorName_;
};
  • 实践(对一个size为N的vector 的每个元素赋值为100 ,在Devcloud上采用DPC++并行执行)
%%writefile lab/gpu_sample.cpp
# include <CL/sycl.hpp>
using namespace std;
using namespace sycl;
int N=10;
void Tes(queue &q,vector<int>&t){
    buffer buf(t);
    q.submit([&](handler &h){
        accessor a(buf , h);
        h.parallel_for(range<1>(N),[=](auto i){
                a[i]=100;
        });
    });
} 
int main(){
 vector<int>v(N);
    queue q;
    Tes(q,v);
    for(auto i : v){
        cout<<i<<std::endl;
    }
}

🌹写在最后💖: 路漫漫其修远兮,吾将上下而求索!伙伴们,再见!🌹🌹🌹


相关文章
|
机器学习/深度学习 数据采集 安全
MiMo-7B:从预训练到强化学习,解锁语言模型的推理潜能
目前,大多数成功的 强化学习 工作,包括开源研究,都依赖于相对较大的基础模型,例如 32B 模型,特别是在增强代码推理能力方面。业内普遍认为在一个小模型中同时提升数学和代码能力是具有挑战性的。然而,小米MiMo研究团队相信 RL 训练的推理模型的有效性取决于基础模型固有的推理潜力。为了完全解锁语言模型的推理潜力,不仅需要关注后训练,还需要针对推理定制预训练策略。
870 43
|
Windows
windows 基于命令行制作vhd虚拟磁盘
什么是VHD?        VHD是Virtual Hard Disk的简称,就是虚拟硬盘,就是能把VHD文件直接虚拟成一个硬盘,在其中能像真实硬盘一样操作,读取、写入、创建分区、格式化。如果你用过虚拟机,就会知道创建的虚拟机都是VHD格式文件,使用VHD技术,就可以把虚拟机直接挂到系统上,实现对里面内容的操作。
1552 0
|
JSON JavaScript 关系型数据库
低代码使用问题之Automat和n8n分别是什么,以及它们的主要功能是什么
低代码使用问题之Automat和n8n分别是什么,以及它们的主要功能是什么
|
弹性计算 Kubernetes 数据处理
KubeRay on ACK:更高效、更安全
阿里云 ACK 以托管组件化的方式给客户提供快速搭建Ray集群的能力,并通过结合使用阿里云的调度,存储,日志与监控,给用户提供更佳使用体验。
|
小程序 数据安全/隐私保护
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
在 `src/http` 目录下创建 `request.ts` 文件,并配置 Taro 的网络请求方法 `Taro.request`,支持多种 HTTP 方法并处理数据加密。
855 0
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
|
Kubernetes 并行计算 Ubuntu
Ubuntu下的K8s部署
云原生基础框架k8s入门级部署,单机到集群。
|
数据中心
使用的 LAN 电缆类型有哪些?
【8月更文挑战第4天】
1006 10
使用的 LAN 电缆类型有哪些?
|
数据采集 存储 数据管理
DAMA数据管理知识体系指南(1):数据管理
DAMA:国际数据管理协会,是一个全球性数据管理和业务专业志愿人士组成的非营利协会,是当前国际上在数据治理领域最权威的机构。 DMBOK2则是DAMA组织众多数据管理领域的国际级资深专家编著,深入阐述数据管理各领域的完整知识体系。它是市场上唯一综合了数据管理方方面面的一部权威性著作。 本系列文章,将针对DMBOK中的核心内容进行解读。
DAMA数据管理知识体系指南(1):数据管理
|
Java 网络安全 数据安全/隐私保护
服务器系列之 成功解决 com.jcraft.jsch.JSchException: Auth fail
文章描述了解决在使用JSCH库连接腾讯云服务器时遇到的`com.jcraft.jsch.JSchException: Auth fail`认证失败错误的步骤,包括修改SSH配置文件和重启SSH服务。
服务器系列之 成功解决 com.jcraft.jsch.JSchException: Auth fail
俄罗斯方块游戏开发实战教程(3):玩家如何控制形状
俄罗斯方块游戏开发实战教程(3):玩家如何控制形状
504 1