0CCh Blog

oneAPI 组件简介

在oneAPI的一系列的产品中,我首先要介绍的是DPC和它的编译器,因为这部分内容十分有趣。我们都知道,一个程序运行效率高低,跟语言本身和他的编译器是息息相关的,比如我们不能指望python的程序在算法和运行环境相同的情况下跑过C和C的程序。

组件

Intel的DPC团队当然考虑到了这一点,DPC和他的编译器正是基于高效的C语言以及时下先进的编译器clang/llvm的。在llvm的支持下,让DPC能够轻松的在不同的平台上使用。

DPC是基于标准C和SYCL的,也就是说,我们可以用C一种语言来编写各种加速平台的程序,这样就让程序员能脱离学习专属语言的麻烦。至于SYCL标准,DPC实际上在它的基础上也做了比较多的优化,方便程序员编写代码。

因为DPC++的编译器是基于clang/llvm的,所以它也是一个开源的编译器,我们可以在Github上找到他的源代码。并且通过翻阅提交记录来初步了解编译器是怎么构建起来的,总的来说这是一个在前中后端都有进行开发的编译器。

oneAPI还提供了一套兼容性工具,这套工具可以将CUDA编写的代码转换为标准的c代码,便于使用DPC进行编译。不过需要注意的是,并不是所有的代码都可以。CUDA代码大约可以有90%到95%能够正确的转换为DPC++的代码,当然剩下的一部分会注释留白,让开发人员进行转换。这个转换工具会尽可能的转换出开发人员可读的源代码程序。

兼容性工具

dpc-compatibility-tool

感兴趣的朋友可以访问以上链接,这里有非常详细的代码和操作例子。

再来说一下oneAPI提供的API,使用API可以让除了C以外的语言也享受到oneAPI提供的强大的高性能计算功能。例如,DPC库,这个还是基于的C++,它是优化了C++标准算法,包括并行算法等,并且能够保证在不同的硬件平台上高效运行。另外,为了让开发人员快速学习,它基于的是pstl和boost.compute库。再例如oneDNN这个库,主要就是用来做深度学习框架的,在oneAPI里提供的tensorflow的底层就是由oneDNN做的支持。

oneAPI提供的库有很多,有兴趣的朋友可以直接上官网查看,会有非常详细的介绍。其实在了解oneAPI之前,我就用过这其中的TBB库,这是一个做并行编程和多线程的库,和微软的PPL很像。简单来说就是在使用这个库的时候,我们不需要关心线程本身,也不需要关心硬件环境使用多少线程效率最高,如何做线程调度效率最高,直接把任务扔到接口就行了,非常方便,即使不编写高性能计算程序的朋友也可以去了解一下。

要介绍的最后一部分是分析和调试工具,这一部分中的GDB,我想大家再熟悉不过,不过oneAPI提供的GDB是有一些不同的,它除了能调试普通程序,还支持通过双机来调试异构程序。也就是说,它可以调试到设备内核代码中。请注意,这里的内核不是指操作系统内核,而是在加速设备上执行代码。使用普通的调试器是无法做到这一点的,虽然看起来都像是C++的代码,但其实编译出的程序并不是像主机端的代码一样可调的。大家也可以试一试,如果使用普通的调试器对内核代码下断点,跑起来的程序是肯定不会中断下来的。

第二个工具是Advisor,这个工具可以对异构程序进行分析,并且提供优化建议,包括怎么使用内存,怎么使用多线程,怎么使用并发。这个工具我是用的不多,有兴趣的朋友还是可以看官方文档。

Vtune

第三个工具是Vtune,这个工具就厉害了,我想做过性能优化的朋友肯定是用过的。这个工具在做性能优化方面并不局限于异构程序,其实很早之前我就接触过它了。它可以对程序性能的缺陷做非常系统的分析,包括IO,线程、内存、指令集的使用等等,分析的粒度可以从指令到代码行再到函数块,支持的架构从CPU、GPU到FPGA,总之做性能优化的朋友千万不要错过这个工具。

以上就是对Intel oneAPI的一个大概的介绍,想了解更多信息还是要访问官网,另外,如果有朋友想进一步的做实验,Intel还提供了DevCloud这样一个免费的实验平台给大家,有兴趣的朋友不妨一试。