目录
话题一:以数据为中心的时代需要什么?
话题二:什么是英特尔oneAPI?
话题三:英特尔oneAPI的亮点
话题四:英特尔oneAPI的作用
话题五:英特尔oneAPI的使用
话题六:英特尔oneAPI未来可期
(官网的页面)
提到英特尔oneAPI,很多人可能会是疑问的表情,不要担心,今天小编就以初学者的身份,通过以下六个话题,带大家走进英特尔oneAPI的世界。
在现在这个以数据为中心的时代,CPU、GPU、FPGA等硬件平台对开发者维护的需求愈发强烈,但是每个独立的代码库需要不同的语言、库、软件工具等进行编程。许多数据密集型、复杂的工作负载,需要CPU、GPU、AI加速器、FPGA等多种架构之间组合,这样的复杂和耗费时间的工作过程,是每一个程序员内心深处无可奈何的痛。
(官网的页面)
英特尔oneAPI 是一项行业倡议,旨在创建一个开放、基于标准的跨架构编程模型,使其可提供跨加速器架构的通用开发人员体验,从而在面对大量跨架构(CPU、GPU、FPGA 和其他加速器)的、以数据为中心的工作负载时,简化开发工作。
英特尔oneAPI包括跨架构语言 Data Parallel C ++(基于 ISO C ++ 和 Khronos Group 的 SYCL)、高级库和社区扩展。
1.跨架构、跨厂商的开放标准
基于这些标准,oneAPI编程简化了软件的开发流程,无需特定的编程语言或供应商,就能提供加速计算的性能,且允许集成现有代码。
2.独特的英特尔® oneAPI 基础工具包
(官网的页面)
英特尔使用英特尔® oneAPI 工具包创建了 oneAPI 产品实现,帮助开发人员针对英特尔® CPU、GPU 和 FPGA 高效地构建、分析和优化高性能、跨架构的应用程序。
3.尖端的编译器、库和调试工具等
英特尔oneAPI拥有并具备:
(官网的页面)
(1)直接编程的英特尔® oneAPI DPC++/C++ 编译器
DPC++ 是 C++ 的演化版本,结合了 SYCL 和社区增强功能。它支持跨目标硬件重用代码,帮助跨 CPU、GPU 和 FPGA 架构实现高生产力和高性能,同时允许特定于加速器的调优。
(oneAPI DPC++官方参考文档)
--------------有需要读者,可以私聊获取--------------
例:要为DPC++应用启用OpenMP卸载,请使用以下命令调用编译器:
DPC PP-fiopen MP-fopenmp-targets = < arch >(Linux)
DPC PP-cl/qi openmp/Qopenmp-targets:< arch >(Windows)
(2) 基于 API 编程的库
强大的库(包含深度学习、数学以及视频和媒体处理)针对特定领域的功能进行了预优化,并通过定制的编码加速计算密集型工作负载。
(3)探查应用、设计建议和调试所需的工具
英特尔® Vtune™ Profiler 可用于快速查找CPU、GPU 和 FPGA 系统中的性能瓶颈;英特尔® Advisor 用于实现高效矢量化、线程化和加速器卸载;英特尔® Distribution for GDB 用于高效排除代码故障。
(官网的页面)
说了这么多,有的人会说,“专业术语”听不懂,那我就用不专业的话浅谈一下作用~~~
英特尔oneAPI可以实现简化多架构编程的目的,即开发者可以自由选择架构,大大降低了使用不同的代码库、编程语言、编程工具和工作流程所带来的复杂性。
在英特尔® oneAPI 工具包的帮助下,可以创建一个新的、独立可迁移的跨架构代码库,极大简化了开发工作,并为多架构环境的部署提供灵活性。
(关于并行编程、编译程序等的视频)
1.以下是(官网的示例编译代码):
#include // std::vector()
#include // std::rand()
#include
#include "oneapi/mkl/blas.hpp"
int main(int argc, char* argv[]) {
double alpha = 2.0;
int n_elements = 1024;
int incx = 1;
std::vector x;
x.resize(incx * n_elements);
for (int i=0; i y;
y.resize(incy * n_elements);
for (int i=0; i x_buffer(x.data(), x.size());
cl::sycl::buffer y_buffer(y.data(), y.size());
// perform y = alpha*x + y
try {
oneapi::mkl::blas::axpy(my_queue, n_elements, alpha, x_buffer,
incx, y_buffer, incy);
}
catch(cl::sycl::exception const& e) {
std::cout << "\t\tCaught synchronous SYCL exception:\n"
<< e.what() << std::endl;
}
std::cout << "The axpy (y = alpha * x + y) computation is complete!" << std::endl;
// print y_buffer
auto y_accessor = y_buffer.template
get_access();
std::cout << std::endl;
std::cout << "y" << " = [ " << y_accessor[0] << " ]\n";
std::cout << " [ " << y_accessor[1*incy] << " ]\n";
std::cout << " [ " << "... ]\n";
std::cout << std::endl;
return 0;
}
2.根据案例进行个人小测试:
#include
constexpr int N = 11;
using namespace sycl;
class IntelGPUSelector : public device_selector {
public:
int operator()(const device& Device) const override {
const std::string DeviceName = Device.get_info();
const std::string DeviceVendor = Device.get_info();
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);
}
编译运行上面的代码,如果没有问题应该输出:
0 1 2 3 4 5 6 7 8 9 10
(官网的页面)
英特尔oneAPI是针对异构的架构(CPU、GPU、FPGA、其他加速器)部署中,会出现不同的架构需要独特的语言、工具和库的问题,为了减轻开发者工作量、方便开发者进行跨架构编程,充分利用跨架构的解决方案,高效地优化应用程序的性能的一个编程模型。
我坚信,在未来,英特尔oneAPI 必将实现更快的应用程序性能、更高的生产力和更大的创新。 其提供的高性能异构计算的统一编程,打造异构计算的新纪元。
本文参考英特尔官网、英特尔oneAPI网站等资源平台的一些论述,并通过CSDN活动页面、哔哩哔哩等平台获取部分参考知识。