OneAPI与DPC++简介
OneAPI是英特尔提出的一种开放的跨架构的编程模型,使开发人员可以自由地跨多个架构使用单个代码库,从而帮助加速计算。
在如今的高性能计算领域,有多种硬件架构可用于运行工作负载——CPU,GPU,FPGA和专用加速器。没有一个架构最适合每一个工作负载。因此,使用混合架构可以在大多数情况下获得最佳性能。但是多种架构的使用也带来了一些编程挑战:
- 开发人员需要使用以数据为中心的不同硬件架构。
- 每个架构都需要各自的编程模型和工具链。
- 软件开发的复杂性限制了架构选择的自由。
而OneAPI提供了一个不同的编程模型,简化了不同架构的开发。通过oneAPI编程模型,开发人员可以用相同的语言和库瞄准不同的硬件平台,并可以使用同一套调试和性能分析工具在不同的平台上开发和优化代码。
在不同的平台和硬件架构上使用相同的语言,使得源代码更容易被重用;即使在代码被转移到不同的硬件架构上时,仍然需要进行平台特定的优化,也不再需要进行代码翻译。而且,使用共同的语言和工具集会使新的开发人员的培训更快,调试更快,生产率更高。
而DPC++是Intel为了将SYCL引入LLVM和oneAPI所开发的开源项目。SYCL是为了提高各种加速设备上的编程效率而开发的一种高级别的编程模型,简单来说它是一种跨平台的抽象层,用户不需要关心底层的加速器具体是什么,按照标准编写统一的代码就可以在各种平台上运行。可以说SYCL大大提高了编写异构计算代码的可移植性和编程效率,已经成为了异构计算的行业标准。值得一提的是SYCL并不是由多个单词的首字母的缩写。DPC++正是建立在SYCL和现代C++语言之上,具体来说是建立在C++17标准之上的。
实验cross entropy:使用DPC++实现异构异步计算程序设计
本节先简单介绍使用DPC++实现异构计算的相关语法,再通过编写CPU和GPU计算程序计算cross entropy
的实验帮助大家入门DPC++异构计算程序的设计。
设备
•设备,表示 OneAPI 系统中的各种硬件。设备类是预定义的设备选择和查询的方法,包含用于查询设备信息的成员函数,支持创建不同硬件, CPU/GPU/FPGA/…
•device_selector 类支持运行时选择特定设备,如default_selector、cpu_selector、gpu_selector…
// Patric Zhao: patric.zhao@intel.com
#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;
int main() {
queue my_gpu_queue( gpu_selector{} );
std::cout << "Selected GPU device: " <<
my_gpu_queue.get_device().get_info<info::device::name>() << "\n";
return 0;
}
可以在oneAPI官网注册账号,进入https://devcloud.intel.com/oneapi/ge