PerfXLab 致力于加速计算的基础软件研发。助力行业摆脱专有编程模型,实现加速计算的高效敏捷开发,实现所有创新计算硬件的价值。研发团队也在RISC-V软件生态上持续投入资源,目标是为RISC-V体系构建一个异构计算软件栈全栈方案(从数学计算库、异构计算框架到科学计算软件)。
近日,PerfXLab实现了在RISC-V平台运行OpenCL 3.0。
OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
在高性能计算领域,OpenCL 作为第一个开放、免费、统一、通用的异构平台并行编程标准,被众多硬件厂商所支持。在缺乏 GPU 的场景中,使用 OpenCL 能在异构系统上加速算法实现。不过,标准是标准,实现需要投入研发资源,两者经常被误解。
最新OpenCL3.0 在兼容之前的版本的同时,还带来了许多新特性。例如:
-
支持异步 DMA 传输
-
支持 SPIR-V IR
-
在kernel中支持大部分C++17的特性
- ……
PoCL(Portable Computing Language) 是 OpenCL 的一种高效的开源实现。它旨在实现可移植性的同时实现 “性能可移植性”,即不必为了避免异构加速设备的底层特性差异导致的性能差异而为不同设备编写冗余的OpenCL代码,减少了人工优化的步骤。目前最新的PoCL3.0 支持了最小的OpenCL3.0功能集。而由于借助了 LLVM14 作为 kernel 编译器,PoCL3.0 可以享受到 LLVM14 带来的性能优化,例如:
-
对各种 RISC-V 向量扩展的支持升级到了 1.0 版本并已经稳定
-
对 AArch64 的自动向量化支持
-
为 RISC-V 的标量类型添加受限 `FP intrinsics`
-
……
RISC-V作为风头正劲的开源指令集架构,其自由、免费、灵活、高速、低功耗、模块化等特点使其许多领域都被重视并取得了一定的效果,也有越来越多的工程师开始考虑在 HPC 领域使用 RISC-V。然而,到目前为止在 OpenCL 的众多开源实现中,还没有直接支持 RISC-V 的实现。
PoCL官方也没有对 RISC-V 进行支持,直接进行交叉编译可能会出现各种难以预料的问题。此前曾有人为 PoCL 添加了一个
Pipeline for RISC-V
分支,并为其增加了对 [Newlib]与 [Vortex]的支持。然而,这项工作的时间"过于久远"且"不再维护",仅支持到了 PoCL1.5 与 LLVM10,无法利用最新的 OpenCL3.0 的特性和 LLVM14 的向量化支持,已然不适应当今的局面。
澎峰科技PerfXLab对原始的“PoCL代码” 进行了一些修改,使工程师们可以顺畅地直接编译、运行,而不必在算法实现以外的部分消耗过多的精力,在 RISC-V 上也能运行 OpenCL3.0、充分享受 OpenCL3.0 带来的便利特性与 LLVM14 的高速优化。
首先,我们 从 PoCL 的原始仓库中fork了一份代码,并新建了 risc-v
分支。该分支修复了一些原仓库的 Bug 并针对交叉编译调整了部分代码。所有的修改都在该分支上进行:
https://github.com/PerfXLab/pocl/tree/risc-v
具体方法可以登陆www.rvboards.org官网获得支持。运行效果截图:
结束语:将 PoCL 移植到 RISC-V 上只是第一步,我们还有很多地方可以研究、探索:PoCL 在 RISC-V CPU 上的加速效果如何?它对 RVV 的支持如何?在没有 V 扩展的 RISC-V 平台上,性能提升又如何?……
相关参考链接如下:
[1]https://zh.m.wikipedia.org/zh-hans/OpenCL
[2]https://www.khronos.org/conformance/adopters/conformant-products#opencl
[3]https://cn.khronos.org/news/press/opencl-3.0-release
[4]https://releases.llvm.org/14.0.0/docs/ReleaseNotes.html
[5]https://github.com/pocl/pocl/issues/790
[6]ttps://github.com/vortexgpgpu/pocl
[7]Blaise, Tine, Seyong Lee, Jeff Vetter, and Hyesoon Kim. “Bringing OpenCL to Commodity RISC-V CPUs,” 2017, 7.
[8]https://github.com/pocl/pocl/issues/840
[opencl]https://www.khronos.org/opencl
[llvm]https://llvm.org/
[pocl]http://portablecl.org/
[riscv]https://riscv.org/
[pocl3.0]http://portablecl.org/pocl-3.0.html
[spirv]https://www.khronos.org/spir/
[newlib]https://sourceware.org/newlib/
[vortex]https://vortex.cc.gatech.edu/
[perfxlab]https://perfxlab.cn/
[poclcode]https://github.com/pocl/pocl
[pocldoc]http://portablecl.org/docs/html/install.html