Vortex: 一种基于RISC-V指令集自定义扩展的开源GPGPU架构
目录
1. 背景知识
1.1 RISC-V设计核心:RISC-V指令集ISA
1.1.1 精简指令集
1.1.2 模块化指令集
1.2 用户自定义指令集扩展
1.3 GPU层次结构
2. Vortex RISC-V GPGPU System
2.1 设计核心:扩展了一个自定义R指令集
2.1.1 Wavefront Control(波阵面控制): wspawn
2.1.2 Thread Control(线程控制): tmc
2.1.3 Control Divergence(控制发散): split / join
2.1.4 Synchronization(同步性):bar
2.1.5 Texture Filtering(纹理滤波):tex
2.2 Vortex GPGPU结构:32bit 五级流水
2.2.1 Wavefront Scheduler
2.2.2 Threads Masks and IPDOM Stack
2.2.3 Wavefront Barriers
2.2.4 Memory System
2.3 编译环境: LLVM编译器
2.3.1 传统编译器(例如gcc)
2.3.2 LLVM编译器
1. 背景知识
1.1 RISC-V设计核心:RISC-V指令集ISA
1.1.1 精简指令集
基本的RISC-V(Reduced Instruction Set Computer)指令数目仅有47条(RV32I)
指令是处理器进行操作的最小单元(譬如加减乘除、读写寄存器数据),指令集就是一组指令的集合。有了指令集架构(ISA,Instruction Set Architecture),就可以使用不同的处理器硬件实现方案来实现不同性能的处理器。为了让软件程序员能够编写底层的软件,指令集架构不仅仅是一组指令的集合,它还要定义任何软件程序员需要了解的硬件信息,包括支持的数据类型、存储器、寄存器状态、寻址模式和存储器模型等。
目前主流架构(譬如x86)是CISC(Complex Instruction Set Computer),极为复杂和冗杂,且不开源,专利授权费昂贵。
RISC-V 架构的目标:
• 成为一种完全开放的指令集,可以被任何学术机构或商业组织所自由使用。
• 成为一种真正适合硬件实现且稳定的标准指令集。
1.1.2 模块化指令集
RISC-V指令集使用模块化的方式进行组织,每一个模块使用一个英文字母来表示,除了I指令集是设计架构时强制要求实现的指令集,其他指令集均可供客户选择。
对比x86,光加减法就有很多条指令,但在RISC-V里面只有ADD,SUB,ADDI
1.2 用户自定义指令集扩展
除了上述模块化指令子集可供客户扩展和选择(这一部分指令的功能和编码是官方定义好的,用户只需要选择要不要设计到架构里),RISC-V预留了大量指令编码空间以支持第三方扩展(自己编码自己定义功能)。目前的自定义扩展基于R-type指令。
(RISC-V稳定性体现之处:规整的指令编码—指令所需的通用寄存器的索引都放在固定的位置)
-指令的第0到6位为Opcode编码段,根据Opcode表规则,inst[1:0]=11,inst[6:2]=00010对应custom0指令组
-inst[31:25]为funct7区间,可作为额外的编码空间,因此一组custom指令组可以编码出128条指令
-xd、xs1、xs2是三个寄存器掩码,为分别代表是否读写rd、rs1、rs2寄存器
1.3 GPU层次结构
sp(streaming processor) : 最基本的处理单元,最后具体的指令和任务都是在sp上处理的。GPU进行并行计算,也就是很多个sp同时做处理。
sm(streaming multiprocessor):多个sp加上其他的一些资源组成一个sm。
warp:GPU执行程序时的调度单位,目前cuda一个warp有32个thread,同在一个warp的线程,以不同数据资源执行相同的指令。
grid、block、thread:在利用cuda进行编程时,一个grid分为多个block,而一个block分为多个thread.其中任务划分到是否影响最后的执行效果。划分的依据是任务特性和GPU本身的硬件特性。
一个sm只会执行一个block里的warp,当该block里warp执行完才会执行其他block里的warp。进行划分时,最好保证每个block里的warp比较合理,那样可以一个sm可以交替执行里面的warp,从而提高效率,此外,在分配block时,要根据GPU的sm个数,分配出合理的block数,让GPU的sm都利用起来,提利用率。分配时,也要考虑到同一个线程block的资源问题,不要出现对应的资源不够。
2. Vortex RISC-V GPGPU System
2.1 设计核心:扩展了一个自定义R指令集
2.1.1 Wavefront Control(波阵面控制): wspawn
在指定PC值到来时,启动%numW个wavefront,标志是这些wavefronts的tread0被激活。同时上一个正在进行的warp对应的src寄存器里的值会被复制到新warp对应的dst寄存器里。
我理解这里的wavefront就是其他论文里的warp,一个warp里包含32个tread
2.1.2 Thread Control(线程控制): tmc
对于每一个wavefront里的tread,有一个32位的CSR(Control and Status register状态控制寄存器),称为tread mask register,每一位代表对应tread的状态(字节掩码),1代表被激活,0代表未被激活。
tmc:%NumTread个tread会被激活(例如等于5时,tread0-4的字节掩码会被置1)
2.1.3 Control Divergence(控制发散): split / join
当同一个warp里的tread进入不同的跳转分支时,会出现控制发散现象(control divergence)
Divergence 是Warp中的一个概念,在同一个warp中有的线程走这个分支,有的线程走另外一个分支,称之为divergence。
一个Warp中的所有Thread执行同一指令。但是,由于不同Thread的数据不同,如果有基于数据的判断,就可能产生不同的结果。这时,就会产生多路径问题即发散,意味着Thread需要执行不同的指令。sm处理的方式是多次执行,每次沿着一条路径,直到所有路径都执行完毕。所以,控制发散直接关系到程序的性能。
Vortex对此的解决方式是加入了一个IPDOM Stack(下文会详细说)
当split指令来临时,代表要出现分支了,%predicate储存了预测将要执行的指令的信息。
当join指令来临时,代表要跳回出现split指令时的那个pc值继续运行。
2.1.4 Synchronization(同步性):bar
同步某一组wavefronts。可能这些wavefronts都在执行同一个操作,但是速度有快有慢。为了让这些wavefronts在某一个节点能同步,让执行快的wavefront等一等慢的,就会设置一个屏障快的wavefront,等到预设的%numW个wavefronts都达到这个屏障了,同步完成,就可以移除这个屏障,让它们进行下一步操作。
2.1.5 Texture Filtering(纹理滤波):tex
该指令用于纹理信息的查找。它有三个源操作数,即u、v、lod,用于查找源texel和纹理mipmap的规范化坐标。其他纹理状态(维度、格式、过滤模式、寻址模式和内存地址)可以通过csr进行配置。
2.2 Vortex GPGPU结构:32bit 五级流水
现有gpgpu架构的普遍特点:
规划了线程如何调度、如何同步以及如何分配内存层次结构
基础结构:取指—译码—执行—存储—写回
特征结构:在五级流水基础上新增模块:更合理高效地利用所有线程,提高计算速度
2.2.1 Wavefront Scheduler
两个组成部分:
(1)wavefront masks: 调用哪个wavefront
(2)wavefront table: 储存每个wavefront的信息
四个线程掩码:
(1)active wavefront mask: 每个bit指出对应wavefront的状态
(2)stalled wavefront mask: 指出哪些wavefronts不能够被临时调用
(3)visible wavefront mask: 支持分层调度
(4)barrier mask: 每一个wavefront都有一个掩码,指示是否在等待bariier来同步
2.2.2 Threads Masks and IPDOM Stack
当分支指令来临时,会进行分支预测,每个线程会有两个预测结果(跳转或者不跳转)。线程会先根据预测true的结果执行,但是会将现在的thread mask和预测flase后下一个指令的thread mask和pc值存储在IPDOM中。当join指令来临时,会有两种情况(1)当前分支完成了,重新回到前面跳转的地方继续运算 (2) 分支预测结果错误,即应该是走false的分支但走了true,于是需要重新走false再执行一次
这样的设计可以减少流水线冲刷,节省计算时间
2.2.3 Wavefront Barriers
用来支持不同wavefront之间的同步。包括
(1) 计数器,统计还有多少个wavefront没有到达barrier,当计数器为0时,该barrier被释放,被同步的这些wavefront开始同时继续执行
(2) barrier mask(应该和wavefront scheduler里的barrier mask是一个东西)
2.2.4 Memory System
除了常规的data cache和instruction cache,增加了一个shared memory,可根据需求作为高速缓存或者堆栈。
不同的core可以聚合成一个集群与L2 cache进行读写,不同集群可以组合成一个处理器与L3 cache进行读写,分层读写可以大大提高存储效率。
2.3 编译环境: LLVM编译器
2.3.1 传统编译器(例如gcc)
前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend)
前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步转换为优化,最终转为新的表示方式,然后再交给让优化器和后端处理;最终由后端生成可执行的机器码。
缺点:三个阶段冗杂在一起,不能独立,牵一发而动全身。如有N种语言(C、OC、C++、Swift...)的前端,同时也有M个架构(模拟器、arm64、x86...)的target,就需要N*M个编译器。
2.3.2 LLVM编译器
LLVM拥有各个阶段都很独立的三段式结构, LLVM不同的就是它的中间表示IR(intermediate representation)编写良好,对于不同的语言它都提供了同一种中间表示,即我们在前端新增一种语言,或者在后端新增一种类似RISC-V的硬件架构,我只需要对IR部分进行优化,但不用重新设计编译器。
Vortex: 一种基于RISC-V指令集自定义扩展的开源GPGPU架构相关推荐
- ios跨线程通知_一种基于Metal、Vulkan多线程渲染能力的渲染架构
快手Y-tech 原创最新技术干货分享 随着3D渲染场景规模越来越复杂,单线程渲染架构在满足业务性能要求时已经捉襟见肘,因此,多线程渲染显得愈发重要.本文首先介绍了新一代图形渲染接口Metal.Vu ...
- Hango Rider:网易数帆开源 Envoy 企业级自定义扩展框架
可扩展性是网络代理软件最为关键的特性之一,灵活强大的可扩展性可以大大拓展网络代理软件的能力边界.作为新兴的开源高性能网络代理软件,Envoy 本身提供了相对丰富的可扩展能力,如基于 C++ 的原生扩展 ...
- java 基于类路径搜索_一种基于ClassLoader的自定义类查找方法与流程
本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法. 背景技术: 随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多.根据不同的业务需要通过反射去获得相应的处理 ...
- RISC V (RV32+RV64) 架构 整体介绍
文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...
- 计组学习笔记2(RISC v版)
指令集解释 (规定:R[r]表示通用寄存器r的内容,M[addr]表示存储单元addr的内容,SEXT[imm]表示对imm进行符号扩展,ZEXT[imm]表示对imm进行零扩展) 整数运算类 -U型 ...
- 空间注意力机制sam_一种基于注意力机制的神经网络的人体动作识别方法与流程...
本发明属于计算机视觉领域,具体来说是一种基于注意力机制的神经网络的人体动作识别的方法. 背景技术: 人体动作识别,具有着非常广阔的应用前景,如人机交互,视频监控.视频理解等方面.按目前的主流方法,可主 ...
- 一种基于边缘Bloom的溶解shader的实现
此文章为转载: 作者:胡说ba道 原文:https://blog.csdn.net/qq_37925032/article/details/80146256 溶解效果在游戏中十分常见,然而普通的溶解效 ...
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
十三种基于直方图的图像全局二值化算法实现 1. 什么是基于直方图的图像全局二值化算法 2. 灰度平均值 3. 百分比阈值(P-Tile法) 3. 基于双峰的阈值 3.1 基于平均值的阈值 3.2 基于 ...
- MULLS:一种基于多尺度线性最小二乘的激光SLAM算法
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨 泡泡机器人SLAM 标题:MULLS: Versatile LiD ...
最新文章
- BZOJ 1412 [ZJOI2009]狼和羊的故事(最小割)
- 7-36 旅游规划 (25 分(Dijkstra)
- 树莓派 红灯不亮_请问我的树莓派烧了系统后板子只有红灯亮,而act绿灯不亮,并且网口不插网线两个灯都是微微亮,请问?...
- a byte of python图书购买_A Byte of Python
- 上一篇的改进!!!!!
- [转载]spring使用PropertyPlaceholderConfigurer加载properties文件处理中文乱码
- Oracle操作管理之用户和角色
- VMware安装windows2003操作系统
- 卸载symantec 找不到vpshellres.dll 解决方案
- 网页前端培训笔记(JavaScript基础语法篇一)
- 百度地图 android 圈区域,Android 百度地图定位半径圈范围自定义
- 黑马python培训视频网盘下载
- access vba代码大全_VBA编程在翻译中的应用
- 读书笔记《TAOCP》 V1 S1.1
- 深度学习系列资料总结
- 安全文章研读:深度学习对抗攻击防御策略的一些实现
- alpine日志中文乱码的问题解决方案
- Python爬虫-爬取豆瓣TOP250
- upc 9367 雷涛的小猫
- 倒计时,距离活动还有0天0时0分0秒