塞巴斯蒂安 发表于 2021-11-11 20:02:08

GSoC项目 Optimize OpenCV for RISC-V 简介

本帖最后由 塞巴斯蒂安 于 2021-11-11 20:02 编辑

我在今年7月至9月参加了Google Summer of Code 2020的"Optimize OpenCV for RISC-V"项目开发,为OpenCV增加了RISC-V平台的向量加速支持。

一、OpenCV Wide Universal Intrinsics

OpenCV在其硬件加速层(HAL, Hardware Accelaration Layer)提供了一套OpenCV内部通用的向量系统,叫做OpenCV Wide Universal Intrinsics,这个向量系统为前端的算法实现提供了可直接调用的向量数据类型和各种向量计算操作的接口等。这套向量系统的优势在于,它为前端程序员提供了统一的向量数据类型与向量操作接口,而这些向量数据类型与向量操作在编译时会自动地被转换为当前目标平台所支持的SIMD或向量体系结构的指令,从而使得OpenCV在任何支持SIMD或向量指令的硬件平台上都能获得指令集层面的数据并行加速。

目前的OpenCV中,通用向量系统(Wide Uniersal Intrinsics)已经获得了基于x86平台的SSE、AVX、AVX512指令集,基于ARM平台的NEON指令集,基于IBM的POWER平台的VSX指令集,和基于MIPS平台的MSA指令集等后端支持。本次GSoC项目,我们的目标是为Wide Uniersal Intrinsics实现近期非常火热的RISC-V指令集及其"V"(向量)扩展(RVV)的支持,从而使OpenCV在RISC-V平台上也能获得向量加速。
二、RISC-V "V" Vector Extension

RISC-V是由加州大学伯克利分校设计研发的⼀种新型精简指令集架构,是由设计团队在过去几种精简指令集架构基础上,总结优缺点而创建的新指令集。由于其开源、轻量、优秀的拓展性等诸多特点,受到学术界和商业界的青睐。

RISC-V的指令集使用模块化方式进行组织,每⼀个模块使用一个英文字母来表示。这些模块可以分为基础模块和扩展模块。RISC-V基础模块包括RV32I, RV32E, RV64I, RV128I。基础模块是固定的,指令集总是包含一个且仅一个基础模块。RISC-V的扩展模块包括M、A、F、D、C、V等。扩展模块是可选的,分为标准扩展和用户⾃定义扩展,根据应用程序的需要,硬件可以包含或不包含这些扩展。   
RISC-V "V"(向量)扩展(RVV)是RISC-V指令集的标准扩展模块之一。它主要在RISC-V基础指令集模块上添加了了向量寄存器和各类向量指令,使得用户可以使用向量体系结构来优化和加速程序代码。虽然目前RISC-V向量扩展规范尚属于草案阶段,但由于其简洁而优雅的设计,该向量扩展已经获得了业界的广泛关注。⽬前RISC-V向量扩展规范的0.9版本已经非常接近向量扩展的最终版本。

RISC-V "V"(向量)扩展规范:
https://github.com/riscv/riscv-v-spec
三、RVV Native Intrinsics

Intrinsic一般是指⾼级编程语言中的低级汇编语言的接口。大部分SIMD或向量指令集都有自己的native Intrinsics,有了Intrinsic,用户就可以在编程中自己选择是否使用这些指令来设计程序,从⽽在应用层⾯允许用户自主使用向量指令来获得数据并行加速。

RISC-V "V"(向量)扩展(RVV)也有自己的native intrinsics。2020年5月8日,EPI,SiPearl和SiFive联合发布了一份RISC-V向量扩展intrinsics的草案。很快这份草案就被RISC-V基⾦会采纳为官⽅的RISC-V向量扩展intrinsics规范。该规范以RISC-V向量扩展的汇编为基础给出了向量指令在C/C++中的接口。

RVV Native Intrinsics是我在本次GSoC项目中实现Wide Universal Intrinsics的RISC-V向量扩展后端支持的主要手段。

RVV Intrinsics规范:
https://github.com/riscv/rvv-intrinsic-doc
三、Compiler Support

RISC-V指令集及其扩展在GCC的RISC-V编译⼯具链中已经获得了较为完整的汇编支持,其中也包括RISC-V "V"(向量)扩展。在今年8月底,SiFive在GCC的RISC-V编译⼯具链中添加了新分支rvv-intrinsic,该分支实现了大部分RVV native intrinsics的支持。GCC的RISC-V编译⼯具链是本次项目的交叉编译环境搭建的主要工具。

RISC-V GNU toolchain:
https://github.com/riscv/riscv-gnu-toolchain

今年8月初,SiFive的RISC-V "V"向量扩展v0.9版本汇编支持也成功进入了LLVM upstream。我的实验室(PLCT Group)在此基础上也参与到LLVM upstream的开发工作中,提交了几个向量Z扩展指令的patch并成功进入了upstream。同时,PLCT实验室也在进行LLVM中的RVV Intrinsics支持工作,目前已经支持了大部分的native intrinsics,能够成功编译本次OpenCV项目的代码。Clang-LLVM也是本次OpenCV RISC-V项目的测试平台之一。

PLCT实验室的LLVM仓库:
https://github.com/isrc-cas/rvv-llvm

四、Method and Test

本次OpenCV RISC-V项目的主要实现方法即,使用RVV Intrinsics实现Wide Universal Intrinsics的向量数据类型及向量操作,并在编译环境与选项中添加RISC-V(RVV)后端,使得OpenCV在RISC-V平台上编译运行时,前端算法所使用的Wide Universal Intrinsics能够成功编译为RISC-V向量指令。
由于目前市场上较难获取支持RISC-V向量扩展的硬件芯片,本次项目的测试方法是在Linux系统下使用GCC工具链或Clang-LLVM交叉编译OpenCV至RISC-V目标平台,并使用QEMU模拟器运行测试。

以上是对GSoC项目 Optimize OpenCV for RISC-V 的一个背景简介,欢迎大家关注2020年10月13日的OpenCV Webinar网络直播,届时我会和大家分享更多的项目细节。
页: [1]
查看完整版本: GSoC项目 Optimize OpenCV for RISC-V 简介