【高性能计算】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;
    }
}

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


相关文章
|
虚拟化 数据中心 异构计算
GPU 虚拟化技术MIG简介和安装使用教程
使用多实例GPU (MIG/Multi-Instance GPU)可以将强大的显卡分成更小的部分,每个部分都有自己的工作,这样单张显卡可以同时运行不同的任务。本文将对其进行简单介绍并且提供安装和使用的示例。
476 0
|
存储 Linux 虚拟化
开源虚拟化平台oVirt4.3简单搭建实践(下)
开源虚拟化平台oVirt4.3简单搭建实践(下)
1184 0
开源虚拟化平台oVirt4.3简单搭建实践(下)
|
安全 Linux 数据安全/隐私保护
Intel TME和MKTME技术解析
# 市场需求 人们对透明全内存加密这个功能的需求主要来自对机密和敏感数据的保护。普通RAM里面储存的数据,在掉电之后,一般都以为是彻底消失了。但其实在一些复杂的离线攻击下,这些数据仍然是能被恢复出来并导致泄密;而持久性存储器(即外存,包括磁盘、SSD、eMMC等)的数据更加容易泄露。这些设备可能有硬件锁机制的保护,但是用户其实希望的是更细粒度的保护,比如per进程/容器/VM级的。 Int
4768 0
Intel TME和MKTME技术解析
|
1月前
|
Kubernetes 调度 算法框架/工具
NVIDIA Triton系列02-功能与架构简介
本文介绍了NVIDIA Triton推理服务器的功能与架构,强调其不仅适用于大型服务类应用,还能广泛应用于各类推理场景。Triton支持多种模型格式、查询类型和部署方式,具备高效的模型管理和优化能力,确保高性能和系统稳定性。文章详细解析了Triton的主从架构,包括模型仓库、客户端应用、通信协议和推理服务器的核心功能模块。
70 1
NVIDIA Triton系列02-功能与架构简介
|
2月前
|
人工智能 自然语言处理 机器人
实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5
本文将以 Qwen2.5-7B-Instruct 为例,介绍如何利用 OpenVINO™ 的 Python API 在本地部署 Qwen2.5 系列模型。
实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5
|
11月前
|
Ubuntu Shell Linux
专为Intel Arc GPU设计:oneAPI的详细图文安装教程
本次我们基于Intel Arc系列的GPU,在windows的WSL上安装oneAPI, 之前发表过纯CPU,通过VM虚拟机的方式,而现在我们在WSL上实现GPU版本的安装
398 0
|
数据可视化 关系型数据库 Linux
开源虚拟化平台oVirt4.3简单搭建实践(上)
开源虚拟化平台oVirt4.3简单搭建实践
1398 0
开源虚拟化平台oVirt4.3简单搭建实践(上)
|
机器学习/深度学习 人工智能 PyTorch
解读最佳实践:倚天710 ARM芯片的Python+AI算力优化 | 龙蜥技术
如何整合 Python+AI 的相关软件并使其在该平台上发挥最高的性能?
解读最佳实践:倚天710 ARM芯片的Python+AI算力优化 | 龙蜥技术
|
机器学习/深度学习 人工智能 弹性计算
|
机器学习/深度学习 人工智能 并行计算
GPU架构及异构计算环境安装配置
GPU架构及异构计算环境安装配置
194 0
GPU架构及异构计算环境安装配置
下一篇
无影云桌面