基于T2S的oneAPI张量计算后端

在当今技术的迅速演变中,异构计算与张量计算已逐渐成为计算领域的焦点。中国科学技术大学的两位研究生,万嘉诚和孙策,凭借其在这一领域的深入研究,为我们揭示了基于T2S的oneAPI张量计算后端的奥秘。

中国科学技术大学万嘉诚和孙策以《基于T2S的oneAPI张量计算后端》为主题,分享了基于T2S框架下的张量计算及在FPGA上的实现,分析了oneAPI后端支持的性能。

以下根据万嘉诚、孙策演讲整理:

从张量计算出发,选取了标准基础线性代数子程序库BLAS中的三个典型张量计算操作:向量内积、矩阵向量乘与通用矩阵乘法进行实现。这三者分别代表了向量与向量之间、矩阵与向量之间以及矩阵与矩阵之间的计算。

在FPGA上,我们实现了上述三个典型算法。我们主要采用脉动阵列技术,这是一种由若干数据处理单元组成的数据驱动的计算网络。这项技术在1979年首次被正式提出,并在近几年因谷歌TPU的兴起而再次受到关注。

关于T2S编程框架,其输入文件为标准的C++文件,其中使用了扩展的DSL,分为算法定义与优化语言两部分。编译器根据DSL中用户指定的优化语言对算法进行若干次优化操作,最终生成支持不同后端的代码文件。我们为T2S添加了oneAPI支持。oneAPI是由英特尔提出的统一异构编程框架,支持CPU、GPU、FPGA等多种硬件平台。经T2S编译器处理后,T2S DSL会生成oneAPI实现和PLUS接口。经过英特尔oneAPI编译器后会生成动态库,用户可以像调用普通的CPU函数一样调用这些算子,完全感受不到加速硬件的存在。

在整个项目中,我们首先实现了T2S已支持的OpenCL后端的张量计算。接着,我们基于OpenCL后端高效地将其实现改写为oneAPI上的实现。为了更好的代码可读性,我们优化了原先的实现方式,但这也带来了一些其他问题,因为在oneAPI中不存在向量化的load/store指令。为了解决这些问题,我们对所有表达式进行了标记,看其是否有副作用。

经过前述所有优化,在英特尔FPGA平台上,GEMM算子的吞吐量可以达到参考实现的95%以上,而OpenCL与oneAPI后端的性能差异并不大。

但对于矩阵向量乘和向量内积,其在OpenCL后端上的性能分别达到了理论峰值的94%和93%。而在oneAPI后端上,这两者的性能分别仅为78%和82%。

虽然在某些情况下,如矩阵向量乘法和向量内积,oneAPI的性能略有下降,但这主要是由于oneAPI编译器在项目完成时还不够完善。尽管如此,团队的研究成果为T2S提供了强大的oneAPI支持,有望进一步推动异构编程框架的发展。

上一篇
下一篇