文章目录

  • 什么是oneAPI?
  • 初探DPC++
  • DPC++的数据管理模块代码示例
    • 1.explicit_data_movement.cpp
    • 2.implicit_data_movement.cpp
  • 总结

什么是oneAPI?

举几个发生在我们身边的情景:我们经常在电脑上办公时临时有事,需要外出处理事情,这个时候我们就会将正在处理的办公事务转移到手机上进行;任何从边缘到云端的应用程序;亦或者是我们会在一个app上看感兴趣的电视,只要我们的电视、电脑、手机上都安装了这个app,我们就能做到多设备连续性的体验。就我们目前正在处理的各种各样的工作负载而言,这是一个令人惊叹的了不起的时代。这些事例都需要一套多样化的架构。在这个时代,我们见证了各种设备和硅片加速器的爆炸式增长。如果我想在云端同时处理1000个处理器,亦或者是利用无人机进行人脸识别。这些加速器,每一个都有自己的库和工具、或者是一个独特的编程模型。这使得它们之间跨架构重用代码并高效工作具有很大的挑战性。为了使开发人员能够以最佳性能实现这种连续体验,有时候必须以java、c++、python和其他语言来编写和重写几乎相同的代码,在多个操作系统上进行编译,有时使用完全不同的API、库、SDK,整个过程中产生大量的系统开销,使我们不能专注于算法和创新。oneAPI的大胆愿景是在为你提供所需的所有性能的同时,拥有一个跨架构,跨供应商的软件可移植性。因此,无论你的系统配备了什么设备和加速器,或者是,这些设备各自使用的是什么语言和库,利用什么中间件或者框架等等,oneAPI都能够桥接、抽象所有的这些设备,并使其具有一个共通点。在这里,可以共享内存空间、代码可以被移植并重新利用、工具可以跨架构使用。oneAPI的行业范围规范定义了软件栈内部的底层抽象层你可以将优化的库集中用于各个领域。


初探DPC++

让我们看一段DPC++示例代码:

#include <CL/sycl.hpp>
constexpr int N = 16;
using namespace sycl;class IntelGPUSelector : public device_selector {public:
int operator()(const device& Device) const override {const std::string DeviceName = Device.get_infoinfo::device::name();
const std::string DeviceVendor = Device.get_infoinfo::device::vendor();
return Device.is_gpu() && (DeviceName.find("Intel") != std::string::npos) ? 100 : 0;
}
};int main() {IntelGPUSelector d;
queue q(d);
int* data = malloc_shared(N, q);
q.parallel_for(N, [=](auto i) {data[i] = i;
}).wait();
for (int i = 0; i < N; i++) std::cout << data[i] << " ";
free(data, q);
}

IntelGPUSelector是一个继承了device_selector的设备选择器,其中device_selector是纯虚类,它有个纯虚函数int operator()(const device& Device) const需要派生类来实现,该函数会遍历计算机上的计算设备,并且返回使用设备的优先级,返回数字越高优先级越高,这里选择Intel的GPU作为首选的计算设备,注意这个函数使用了override来说明其目的是覆盖虚函数。queue的目的是指定工作的目标位置,这里设置的是Intel的GPU。

DPC++的数据管理模块代码示例

1.explicit_data_movement.cpp

代码如下(示例):

#include <CL/sycl.hpp>
#include<array>
using namespace sycl;
constexpr int N = 42;int main() {queue Q;std::array<int,N> host_array;int *device_array = malloc_device<int>(N, Q);for (int i = 0; i < N; i++)host_array[i] = N;// We will learn how to simplify this example laterQ.submit([&](handler &h) {// copy hostArray to deviceArrayh.memcpy(device_array, &host_array[0], N * sizeof(int));});Q.wait();Q.submit([&](handler &h) {h.parallel_for(N, [=](id<1> i) { device_array[i]++; });});Q.wait();Q.submit([&](handler &h) {// copy deviceArray back to hostArrayh.memcpy(&host_array[0], device_array, N * sizeof(int));});Q.wait();free(device_array, Q);return 0;
}

2.implicit_data_movement.cpp

代码如下(示例):

#include <CL/sycl.hpp>
using namespace sycl;
constexpr int N = 42;int main() {queue Q;int *host_array = malloc_host<int>(N, Q);int *shared_array = malloc_shared<int>(N, Q);for (int i = 0; i < N; i++) {// Initialize hostArray on hosthost_array[i] = i;}// We will learn how to simplify this example laterQ.submit([&](handler &h) {h.parallel_for(N, [=](id<1> i) {// access sharedArray and hostArray on deviceshared_array[i] = host_array[i] + 1;});});Q.wait();for (int i = 0; i < N; i++) {// access sharedArray on hosthost_array[i] = shared_array[i];}free(shared_array, Q);free(host_array, Q);return 0;
}

总结

oneAPI 的DPC++库可以对DPC++内核加速并优化C++的算法等。AI工具分析套件是基于oneAPI借助优化的深度学习框架和高性能python库,这些套件可以帮助加速端到端机器学习和数据科学流程。OpenVION工具套件可以加速开发具备高性能深度学习推理计算机视觉功能的视觉/AI应用它支持在硬件加速器上进行深度学习,并轻松部署到多种类型的英特尔平台上。这些强大的组件可以加快开发人员在开发的过程中的效率,使得其在开发过程中更加方便。

英特尔oneAPI---跨架构实现高效率相关推荐

  1. 英特尔OneAPI介绍

    oneAPI是什么? Intel oneAPI 是一个跨行业.开放.基于标准的统一的编程模型,它为跨 CPU.GPU.FPGA.专用加速器的开发者提供统一的体验,包含两个组成部分∶ 一项行业计划和一款 ...

  2. 英特尔oneAPI——异构计算学习总结

    英特尔oneAPI--异构计算学习总结 oneAPI编程模型 多架构编程面临的挑战 SYCL DPC++ 编译和运行DPC++程序 编程实例 实现矢量加法 queue类 Parallel kernel ...

  3. 【英特尔oneAPI——异构计算编程】

    英特尔oneAPI--异构计算编程 初识oneAPI oneAPI简介 选择oneAPI的理由 使用 oneAPI 可以做什么 oneAPI包含的内容 异构计算编程 什么是异构计算编程 异构编程学习参 ...

  4. 英特尔oneAPI——通过DPC++实现异构计算

    OneAPI与DPC++简介 OneAPI是英特尔提出的一种开放的跨架构的编程模型,使开发人员可以自由地跨多个架构使用单个代码库,从而帮助加速计算. 在如今的高性能计算领域,有多种硬件架构可用于运行工 ...

  5. 英特尔oneAPI———神奇的oneAPI

    oneAPI拥有一个跨架构,跨供应商的软件可移植:oneAPI能够桥接.抽象所有的设备,并使其具有一个共通点:可以共享内存空间,代码可以被移植并重新利用,工具可以跨架构使用. oneAPI的行业范围规 ...

  6. 英特尔oneAPI创新大使招募

    参加本次活动 不仅能获得奖品 还能提高技术 并有机会认识更多志同道合的小伙伴 欢迎大家踊跃参加! (PS:本次活动我们还准备了奖金哦!) 活动介绍 英特尔 oneAPI 创新大使将面向全球范围的 HP ...

  7. 英特尔oneAPI—爱恨情仇之谁与争锋

    目录 话题一:以数据为中心的时代需要什么? 话题二:什么是英特尔oneAPI? 话题三:英特尔oneAPI的亮点 话题四:英特尔oneAPI的作用 话题五:英特尔oneAPI的使用 话题六:英特尔on ...

  8. 英特尔oneAPI—高斯消元算法并行化

    英特尔oneAPI简介 Intel oneAPI是一个跨行业.开放.基于标准的统一的编程模型,旨在提供一个适用于各类计算架构的统一编程模型和应用程序接口.也就是说,应用程序的开发者只需要开发一次代码, ...

  9. 英特尔Nehalem微架构三级缓存原理学习

    英特尔Nehalem微架构包含式(Inclusive)三级缓存体系架构: 注释:包含式(inclusive)缓存指的是该缓存中包含低级缓存中的内容.包含式三级缓存即在三级缓存中有着二级缓存数据的副本. ...

  10. 【历史上的今天】6 月 4 日:微软收购 Github;MacOS Mojave 推出;英特尔发布第四代架构 Haswell

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 6 月 4 日,在 1998 年的今天,我国互联网用户突破一百万.自从中国科学技术网在国内首次实现了 ...

最新文章

  1. 深入解读ADO.NET2.0的十大最新特性
  2. mysql从入门到转行图片_数据小白转行之路-MYSQL(二)
  3. 解决JDBC连接mysql时server time zone问题及com.mysql.jdbc.Driver is deprecated
  4. Python pytest框架之@pytest.fixture()和conftest详解
  5. 1.7 编程基础之字符串 25 最长最短单词 python
  6. mysql 导出bson格式_mongodb 导入导出GridFS【图片/文件/视频/音频等多媒体文件的导入导出】...
  7. log4j.dtd_Eclipse log4j.xml –无法将log4j.dtd验证为XML定义
  8. 腾讯云服务器ftp部署及文件上传
  9. 使用Python构造数据包
  10. c++ 制作走迷宫游戏
  11. 字节跳动AI lab计算机视觉实习生面试教训
  12. 语音识别(ASR)论文优选:关注语音识别系统Fairness问题Towards Measuring Fairness in Speech Recognition
  13. 《月下独酌》赏析-(李白明月姑娘之一)
  14. Matlab nargin
  15. 《惊涛骇浪》设计日志
  16. python nltk语义分析_Python nltk 如何解析出英语短语?
  17. html中加入emjio表情,html网页上显示emoji表情
  18. 计算机科学与技术指导情况记录表,计算机科学与技术学院工作记录模板.doc
  19. 进阶 Nginx 高手必须跨越的 5 座大山
  20. VirtualBox磁盘扩容

热门文章

  1. echart 广州3d_vue echarts 3D地图+省+弹窗
  2. 【JVM】GC垃圾回收(三)——零落成泥碾作尘,只有香如故
  3. 用js做购物界面的常用效果
  4. 机房服务器系统监控软件,机房服务器系统监控软件
  5. 速达软件商品流通企业解决方案
  6. 知识|Takt Time · Cycle Time · Lead Time
  7. 一个女孩写给monica信 转贴
  8. 2020-mac教程-sudo spctl --master-disable用不了
  9. c语言存储类型关键字作用,C语言, 存储类型关键字?
  10. Raki的读paper小记:Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks