全文 -- Vortex: Extending the RISC-V ISA for GPGPU and 3D-Graphics Research - 指南

news/2025/9/27 16:29:12/文章来源:https://www.cnblogs.com/lxjshuju/p/19115255

Vortex: Extending the RISC-V ISA for GPGPU and 3D-Graphics Research

Vortex:扩展RISC-V ISA以支持GPGPU与3D图形研究
佐治亚理工学院

摘要

        开源硬件与软件的重要性日益增长。然而,尽管GPU是各种应用中较为流行的加速器之一,但公共领域却鲜有开源GPU基础设施。我们认为,缺乏开源GPU基础设施的原因之一在于其ISA和软件栈的复杂性。在本工作中,我们首先提出了一种对RISC-V的ISA扩展,以支持GPGPU和图形处理。该ISA扩展提案的主要目标是尽量减少ISA的变更,从而使得开源生态系统的相应改动也最小化,这有助于构建一个可持续发展的开发生态系统。为了验证经过最小扩展的RISC-V ISA的可行性,我们在FPGA上实现了Vortex的完整软件和硬件栈。Vortex是一个基于PCIe的软GPU,支持OpenCL和OpenGL。Vortex可用于多种应用,包括机器学习、图分析和图形渲染。Vortex在Altera Stratix 10 FPGA上可扩展至32个核心,在200 MHz频率下提供25.6 GFlops的峰值性能。

CCS概念
计算机系统组织 → 多核体系结构。

关键词
可重构计算,计算机图形学,存储系统。

ACM参考格式
Blaise Tine, Fares Elsabbagh, Krishna Yalamarthy, Hyesoon Kim, {btine3, fsabbagh, kyalamarthy, hyesoon.kim}@gatech.edu, 佐治亚理工学院. 2021. Vortex:扩展RISC-V ISA以支持GPGPU与3D图形研究. 发表于MICRO'21:第54届IEEE/ACM国际微体系结构研讨会 (MICRO '21), 2021年10月18–22日, 希腊,线上活动. ACM, 纽约, 美国, 13页. https://doi.org/10.1145/3466752.3480128

1 引言


        数据并行体系结构和通用图形处理器(GPGPU)的出现为解决多核处理器的功耗限制和可扩展性提供了新的机遇[25],为利用新兴大数据并行应用(如机器学习和图分析)中丰富的数据并行性开辟了新途径。特别是GPGPU,凭借其单指令多线程(SIMT)执行模型,充分利用数据并行多线程以相对较低的能耗成本最大化吞吐量,在能效竞赛(Green500 [30])以及基于加速器的并行编程模型的应用支持方面处于领先地位[57][50]。

        由于缺乏开源硬件实现,针对GPGPU的体系结构研究主要集中于在中间语言(IL)级别(PTX [52], HSAIL [56])对硬件体系结构进行建模的模拟器[10][54][31][63][41][23]。在IL级别模拟复杂硬件可能会掩盖对性能有显著影响的微体系结构的若干方面[32]。最近出现的基于全系统ISA的GPU模型模拟[55]缩小了与实际硬件的评估差距,但仍然存在局限,因为它未覆盖其他重要领域,如运行时评估、能效、可靠性以及在使用RTL级实现时可以进行的详细微体系结构评估。已有一些开源GPGPU硬件的实现[1][21][16][4][17][11]被提出,它们提供了各种GPGPU组件的详细微体系结构描述。然而,这些实现缺乏对缓存子系统的详细描述,而缓存子系统是GPGPU中性能最关键的组件之一。此外,这些实现中使用的ISA是定制或专有的,限制了应用支持和广泛采用。

        近期的两个技术趋势为重新审视和扩展开源GPGPU以用于硬件研究提供了机遇:(1)高端FPGA在消费市场的出现。当今具有浮点DSP和大容量存储器的高容量FPGA以较低的能耗预算提供了高计算能力,这使得实现具有详细缓存子系统并能以合理速度运行的全功能GPGPU成为可能。(2)RISC-V [7]的出现,其免费、开放且可扩展的ISA,为以更低成本设计硬件体系结构提供了新的自由度,并可利用其丰富的开源软件和编译器工具生态系统。将RISC-V ISA用于GPGPU处理器体系结构为广泛采用奠定了坚实基础。

        如今,图形加速仍然是一个重要的研究领域,因为对高速、高质量实时渲染[39, 46, 64, 65]的需求持续增长。当前随着Google Stadia [29]和Microsoft xCloud [49]将游戏GPU计算转向云端,这给图形计算带来了新的挑战,包括实时延迟、可扩展性以及安全性。然而,据我们所知,目前尚无集成完整软件和硬件栈的开源图形流水线基础设施。

        在本文中,我们介绍Vortex¹,一个面向高端FPGA的开源、基于RISC-V的软GPU(图1)。本工作旨在探索在现代FPGA上设计和实现GPGPU。此任务面临的挑战是:首先,确定GPGPU ISA的一个子集,该子集需覆盖现代GPGPU中SIMT执行模型的基本能力,并且仍能适配于FPGA。其次,找到一种在RISC-V ISA之上实现GPGPU微体系结构的有效方法,同时保持与标准的兼容性。第三,探索适合FPGA的微体系结构,以最大化资源利用率。

        我们特别关注最小化ISA扩展,原因有二:(1)尽可能利用现有的开源硬件和软件生态系统;(2)提供一个可持续发展的开发生态系统。我们认为本工作最有价值的发现之一是,仅需向标准RISC-V ISA添加六条新指令,Vortex处理器即可执行GPGPU应用并加速3D图形流水线。

        除了标准的SIMT微体系结构组件外,Vortex还实现了一个详细的高带宽非阻塞缓存子系统,该子系统采用针对FPGA优化的多端口多体架构。它还集成了一个基于PCIe的命令处理器,用于像传统GPGPU那样与主机处理器通信。该平台还实现了一个支持OpenCL的健壮的编译器、驱动程序和应用程序栈。我们还通过实现纹理采样单元[66]扩展了微体系结构,使该平台能够支持图形渲染。Vortex从头开始设计时使用了弹性流水线[22][53],在整个设计中提供了一致性,并实现了使代码更易于研究和扩展的设计模式。

本文的主要贡献如下:
• 我们展示了当前GPGPU ISA的分类法,并提出了一个覆盖基本SIMT微体系结构能力的最小子集。
• 我们描述了Vortex的SIMT微体系结构、其纹理单元实现及其光栅化流水线。
• 我们详细介绍了Vortex高带宽非阻塞缓存的实现,该缓存采用针对FPGA优化的多端口多体架构。
• 我们论证了弹性流水线在大型多线程体系结构上的有效性,以及如何利用它将处理器扩展至32个核心,同时保持良好的工作时钟频率。
• 我们展示了基于PCIe的软GPU框架在现代FPGA上的评估。

The Vortex’s project is available at http://vortex.cc.gatech.edu.

https://github.com/vortexgpgpu/vortex

https://github.com/vortexgpgpu/vortex_tutorials

2 图形处理背景

图2展示了可编程3D图形流水线的主要阶段:

  • 几何阶段:在此阶段,来自应用程序的输入顶点通过可编程的顶点着色器变换为屏幕空间的三角形图元。

  • 光栅化阶段:进入此阶段的三角形被逐像素遍历,并调用片段着色器来生成最终渲染到目标缓冲区的颜色。

  • 纹理采样:这是片段着色器中的一个阶段,将像素颜色与纹理数据(纹素)进行组合。纹理采样阶段的输入是归一化的纹理坐标和过滤模式。常用的过滤技术包括点过滤、线性过滤、双线性过滤和三线性过滤。点采样返回输入位置最近的纹素,而双线性过滤返回四个最近纹素的插值。三线性过滤则结合了不同分辨率(mipmaps,见图3)的相邻纹理表面的双线性过滤结果。

        现代GPU支持两种渲染架构:1) 即时模式渲染,即三角形图元按其生成的顺序立即送交光栅化;2) 基于瓦片的渲染[60],即将几何输出结果细分,并基于每个瓦片进行光栅化,以减少内存占用。光栅化是GPU中计算和内存最密集的阶段,其主要瓶颈在于内存访问密集的纹理采样操作[34]。现代GPU在多线程处理器上执行着色器,而光栅化则通过固定功能硬件完成。也可以完全使用GPU计算流水线[43]在软件中实现整个图形栈,同时保持相对合理的性能(性能下降约1.5-8倍)。Larrabee [58] 最早尝试了这种方案,仅对纹理采样进行硬件加速,而将流水线的其余部分移至软件实现。其纹理采样单元支持所有过滤模式,包括Mipmapping [26]。由于FPGA上可用资源面积有限,我们选择了遵循Larrabee的软件渲染方法,仅对纹理采样进行硬件加速。软件渲染对Vortex的另一个好处是,它使得在平台上灵活探索各种渲染算法成为可能。Vortex与Larrabee的不同之处在于,仅将光栅化任务卸载到FPGA执行,而允许几何处理在主机处理器上并发执行,以实现负载均衡。

3 GPU指令集架构

3.1 GPGPU ISA分类概览

        表1展示了对不同ISA的比较评估:Nvidia PTX [52]、AMD RDNA [2]、AMD GCN [3]、Intel GEM [35] 和 PowerVR 移动GPU [61]。我们排除了调试、异常处理和其他系统管理指令。

  • 线程模型:AMD GCN 实现了包含64个线程的波阵面,这些波阵面被分组到计算单元中。RDNA 对 GCN 的计算单元进行了扩展,引入了由两个CU组成的工作组。它还引入了一种新的32线程波阵面模式。PTX 使用 Warp 结构表示波阵面,每个Warp包含32个线程,而协作线程数组结构表示一组Warps。CTAs 被分组为网格。GEN 架构以CPU为中心,具有由硬件分发和管理的根线程,以及在着色器执行期间从其父根线程动态派生的子线程。PowerVR 定义了一个统一着色簇结构,用于对多个线程进行分组。

  • 内存模型:除了全局内存和常量内存,AMD GPU 还实现了由工作组内所有线程共享的专用本地内存,以及跨所有工作组的全局共享内存。PTX 在CTA级别有一个共享内存结构,并为纹理提供了额外的专用内存空间。GEM ISA 仅像传统CPU架构一样定义了全局内存空间,将其管理和组织留给软件处理。在PowerVR上,共享内存通过两个寄存器组建模:一个是ALU本地的统一存储,另一个是USC本地的公共存储。

  • 寄存器文件:所有ISA都支持SIMD向量寄存器,其中AMD还有一个独立的标量寄存器文件。在RDNA上,着色器程序可以访问256个32位向量寄存器和106个32位标量寄存器。GEM 每个线程拥有更大的128个256位向量寄存器,并支持通过谓词寄存器进行谓词执行。PowerVR 具有128位SIMD向量寄存器,同样支持谓词执行。

  • 线程控制:GEM ISA 使用消息传递指令来处理线程与处理器内部其他硬件组件之间的通信。它用于控制线程的派生和终止。AMD 使用线程掩码来控制线程的活动状态,并提供了专用的 ENDPGM 指令来终止一个波阵面。PTX 使用谓词执行来控制线程活动。

  • 同步:所有架构都支持屏障和内存栅栏指令。AMD ISA 定义了一条显式的 WAIT_CNT 指令,用于刷新先前发出的指令和数据依赖计数器指令。GEM 使用消息传递进行线程同步和内存栅栏操作。PTX 分别提供了显式的 barrier 和 membar 指令用于线程同步和内存栅栏。

  • 流控制:所有ISA都提供了标准的分支指令。对于控制流发散的特殊情况,应用程序可以使用谓词执行或线程掩码来控制线程的活动状态。GCN 和 GEM 为编译器提供了显式的 split/join 指令,用于分别在发散点和收敛点对代码块进行标注。

  • ALU操作:所有ISA都支持标准的整数和浮点算术运算。除了PowerVR不支持双精度外,其他都支持双精度、单精度和半精度浮点格式。还支持特定于向量的指令,用于混洗元素或执行归约操作。

  • 内存操作:GEM ISA 通过消息传递实现内存加载/存储和原子操作。预取由硬件自动完成。除了标准的加载/存储操作外,RDNA、GCN 和 PTX ISA 提供了显式的内存预取指令。

  • GPU操作:所有ISA都定义了纹理采样指令,对于深度和模板缓冲区等非纹理资源也是如此。PTX 增加了用于加载预过滤纹理数据和查询纹理状态的显式指令。在GEM上,所有纹理查询和过滤操作都通过消息传递处理。RDNA、GCN 和 GEM 提供了用于插值梯度值的显式指令。PowerVR 具有用于像素迭代、Alpha测试和深度测试的专用图形指令。

        总之,大多数支持SIMT执行模型的GPGPU架构共享以下特征:1) 某种形式的线程和内存层次结构;2) 线程控制和同步结构;3) 内存同步机制。在设计Vortex ISA时,由于RISC-V的依赖关系,我们无法支持谓词执行。为了支持线程发散,我们不能像AMD GPU那样依赖使用寄存器来存储发散栈,因为RISC-V没有足够的空闲寄存器。我们选择在内部硬件架构中采用显式的 split/join 指令。同时,由于纹理查找操作通常是软件渲染流水线中的性能瓶颈,我们选择支持纹理采样指令以处理图形工作负载。对于内存同步,我们利用了RISC-V的 fence 指令。

3.2 Vortex ISA

        Vortex 通过添加六条新指令来扩展 RISC-V ISA 以支持 GPGPU:                wspawntmcsplitjoinbar 和 tex,如表 2 所示。它们都是 RISC-V R 型指令,并使用同一个操作码。这些指令以最小的 ISA 增量为代价,提供了处理波阵面激活、线程控制、控制流发散、同步和纹理过滤的能力,这些都是支持 SIMT 执行模型和图形处理的基本计算原语。

波阵面控制:我们提出了 wspawn 指令,用于在特定程序的 PC 值处激活一定数量的波阵面,使得该程序的多个实例能够独立执行。
线程控制:我们提出了 tmc 指令,通过线程掩码寄存器来激活或停用波阵面内的线程,该寄存器也可通过控制状态寄存器进行访问。
控制流发散:我们提出了 split 和 join 指令来处理控制流发散。split 指令将关于当前线程掩码状态和所有线程的分支谓词结果的信息压入一个由硬件直接维护的后支配节点栈中,而 join 指令在重新收敛时将这些信息弹出。
同步:我们提出了 bar 指令,用于在屏障点同步波阵面的执行。当预期数量的波阵面到达屏障时,该屏障被释放。此外,屏障 ID 编码了其作用域是局部的(核心内)还是全局的(核心间)。


纹理过滤:我们提出了 tex 指令用于纹理查找。该指令遵循 RISC-V ISA 的 R4 类型格式(当前用于乘加操作)。它有三个源操作数:uvlod,分别指定源纹素的归一化坐标和用于查找的纹理 mipmap 层级。其他纹理状态(维度、格式、过滤模式、寻址模式和内存地址)可通过 CSR 进行配置。

表 2:提议的 RISC-V Vortex ISA 扩展。

指令描述
wspawn %numW, %PC波阵面激活
tmc %numT线程掩码控制
split %pred控制流发散
join控制流重新收敛
bar %barID, %numW波阵面屏障
tex %dest, %u, %v, %lod纹理采样/过滤

4 硬件实现

4.1 Vortex 微体系结构

        图 4 详细展示了 Vortex 微体系结构的各个组件,它实现了一个标准的五级流水线 RISC-V 处理器,并增加了以下 SIMT 硬件组件:1) 硬件波阵面调度器,包含 PC、线程掩码寄存器和 IPDOM 栈;2) 分体式通用寄存器堆,存储每个波阵面中每个线程的通用寄存器;3) 高带宽缓存,支持活动波阵面中的线程并行访问;4) 屏障控制模块,用于波阵面级别的同步。该处理器实现了可扩展的体系结构,允许多个核心组成集群,并可选择配备 L2 和 L3 缓存。一个命令处理器管理板载内存系统并通过 PCIe 与主机处理器通信。

4.1.1 波阵面调度器

         取指阶段的波阵面调度器决定从指令缓存中取什么指令(见图 4)。它包含两个部分:1) 一组波阵面掩码,用于选择下一个要调度的波阵面;2) 一个波阵面表,包含每个波阵面的私有信息。调度器使用四种线程掩码:1) 活动波阵面掩码,每位指示一个波阵面是否活跃;2) 停滞波阵面掩码,指示哪些波阵面应被暂时停止调度;3) 屏障掩码,用于在屏障指令处等待的停滞波阵面;4) 可见波阵面掩码,用于支持分层调度策略。每个周期,调度器从可见波阵面掩码中选择一个波阵面,并使该波阵面在掩码中无效。当可见波阵面掩码为零时,通过检查当前哪些波阵面活跃且未停滞来重新填充活动掩码。

4.1.2 线程掩码与 IPDOM 栈

         为了支持 SIMT,硬件中增加了一个线程掩码寄存器和一个 IPDOM 栈,与其他 SIMT 架构类似。当一个波阵面执行 split 指令时,会评估每个线程的谓词值。在发生发散的情况下:1) 将当前线程掩码作为"顺序执行路径"压入 IPDOM 栈;2) 将谓词为假的活跃线程与下一个 PC 值一起压入栈;3) 执行恢复,线程掩码设置为谓词为真的活跃线程。当执行 join 指令时,栈被弹出,线程掩码设置为存储的值。如果弹出的条目不是"顺序执行路径",则在存储的 PC 处恢复执行。

4.1.3 波阵面屏障

         硬件中提供了屏障以支持波阵面间的同步。一个屏障表为每个条目保存以下信息:1) 仍需执行该屏障的波阵面数量计数器;2) 被该屏障阻塞的波阵面掩码。在多核配置中,一个类似的表也用于全局屏障(屏障 ID 的最高位指示全局作用域)。当执行屏障指令时,处理器相应地更新屏障计数器和掩码。如果计数器为零,则使用掩码来释放被阻塞的波阵面。

4.1.4 内存系统

         每个核心有一个指令缓存和一个数据缓存。还有一个可选的共享内存,可根据应用充当便笺式存储器或栈。核心可以分组为集群,集群可以选择性地连接到一个共享的 L2 缓存。集群可以共享一个可选的 L3 缓存。缓存之间提供了刷新操作,作为提供弱一致性内存空间的一种手段。

4.2 3D 图形支持

4.2.1 硬件纹理过滤

         硬件实现了可配置的纹理单元以支持图形。每个纹理单元在给定的 (u, v) 源坐标和指定细节层次 lod 操作数下,对 1D 和 2D 纹理实现点采样和双线性采样。更高级的过滤算法(如三线性或各向异性过滤)则作为伪指令实现,通过调用多条 tex 指令来对跨 mipmap 的过滤操作进行平均(参见算法 1)。该实现支持 OpenGL 定义的各种纹理格式和纹理环绕模式。

算法 1:三线性过滤

1: function Trilinear(, , , )
2:      ← tex(stage, u, v, lod)
3:      ← tex(stage, u, v, lod+1)
4:     return LERP(, , FRAC())
5: end function

4.2.2 纹理单元微体系结构

        图 5 展示了一个纹理单元的微体系结构。它实现了三个主要阶段:纹理地址生成器 ❶、纹理内存系统 ❷ ❸ ❹ 和纹理采样器 ❺。该设备由内核通过 CSR 进行配置,活动纹理状态的数量是可配置的。

        当一条 tex 指令被发送到纹理单元时,uvlod 参数被用来从 CSR ❻ 中获取纹理操作的相关控制信息。特定于 mipmap 的基地址,以及来自 CSR 的环绕和步长信息,被传递给地址生成器。在给定的过滤模式(点过滤或双线性过滤)下,地址生成器将 (u, v) 值并行地为所有线程转换为纹素地址(点过滤为单个地址,双线性过滤为四个地址)❶。这些纹素地址,连同元数据(波阵面 ID、格式和混合值)被传递给纹理内存单元。纹理内存单元首先对跨线程重复的内存访问进行去重 ❷。一批唯一的地址连同指令元数据被传递给纹素内存调度器,以便发送到数据缓存 ❸。接收到缓存响应后,返回的纹素被复制并输送到一个缓冲区中,等待送入纹理采样器 ❹。只有当批次中的所有纹素都已返回时,调度器才开始处理下一批。纹素采样器对传入的纹素执行格式转换和双周期双线性插值。最后,为每个线程生成一个过滤后的 RGBA 颜色并送出纹理单元 ❺。

        此采样器与 [68] 中的采样器非常相似,不同之处在于他们的实运行在不同的移动图形 API 上且具有自定义位宽,而我们的采样器支持 OpenGL 颜色格式。纹素采样器仅实现双线性过滤。点采样是通过使用混合值为 0 的双线性过滤来执行的。尽管点采样本可以只需一个周期,但为了支持可变延迟采样器而所需的复用和同步开销,并不值得只为节省一个周期。

纹理单元微体系结构的设计灵感来源于 [27] 和 [68]。

4.3 高带宽缓存

        现代GPGPU集成了非阻塞高带宽缓存以缓解内存压力,允许缓存子系统并发处理多个独立的请求。在FPGA上实现的NBHB缓存采用不同的技术来降低存储器设备中多端口的高成本:1) 多体化:这是常见解决方案,将缓存划分为单端口存储体,但这会引入存储体冲突;2) 虚拟多端口或多倍频技术:利用存储器设备更高的时钟速度,通过总线分时处理多个请求。该方案受限于存储器时钟速度,需以基频的2倍运行;3) 活跃值表方法:为每个读写端口复制存储器,并维护独立的LVT存储来跟踪持有最近写入地址的内存块。与前述方法相比,LVT缓存具有更高的面积和存储需求。我们的实现采用了一种混合解决方案,通过利用缓存行局部性的虚拟端口来扩展多体化技术。

        图6描述了Vortex中使用的高带宽缓存微体系结构。它是一个多体、非阻塞的流水线缓存架构。每个存储体维护自己的缺失状态处理寄存器以降低缺失率,这是借鉴自[8]的解决方案。该流水线包含四个阶段:1) 调度:从传入的核心请求、内存填充或MSHR条目中选择下一个进入流水线的请求,优先级给予后者;2) 标签访问:对标签存储进行单端口访问;3) 数据访问:对数据存储进行单端口访问;4) 响应:处理返回核心的响应。后端是存储体合并器,来自各存储体的输出响应根据其请求标签进行合并。缓存前端是存储体选择器,根据地址将传入的核心请求分配给各个存储体。存储体选择器还通过一次只选择一个进入特定存储体的请求来解决存储体冲突。如果启用了虚拟端口,存储体选择器会将映射到同一存储体和同一缓存行的请求进行合并。算法2展示了虚拟端口选择的伪代码,其中使用取模运算来更新每个端口的匹配有效位。在此方案中使用虚拟端口在两方面是高效的:1) 虚拟端口所需存储极小,因为我们只需在MSHR中存储每个端口的字偏移;2) 数据访问的输出是一个完整的块,在读取期间现在可以被充分利用。缓存内部可能以两种方式发生死锁:1) 当MSHR已满且新请求已进入流水线时;2) 当内存请求队列已满且有新的内存响应到达时。我们通过在新请求发出前使用"早满"信号来缓解MSHR死锁。我们通过确保内存请求队列永不填满来类似地缓解内存死锁。

4.4 弹性流水线

        Vortex的设计主要目标是服务于体系结构研究;从一开始就奠定使其硬件架构更易于维护和修改的基础非常重要。我们最初探索使用硬件构造语言,但为了更广泛的采用和可达性,转而重新使用Verilog。我们从头开始实现Vortex,在所有主要架构组件、子组件(包括仲裁器、多路复用器、交叉开关等库)中强制使用弹性设计模式。在整个代码库中保持这种一致性使得支持以下特性成为可能:1) 可扩展性:弹性握手协议简单直观,允许灵活地轻松扩展;2) 跟踪和调试支持:基于流水线的请求被分配了标签,该标签由指令PC和波阵面标识符组成,用于跟踪处理器内部指令和其他请求类型的生命周期。我们利用SystemVerilog的Interface构造来实现设计中的所有弹性连接。图7展示了一个取指请求的示例,该请求从波阵面调度器发出,进入指令缓存,然后作为携带所取指令的新响应接口退出,并在进入译码阶段时仍保留其原始标签。

4.5 硬件模拟

        Vortex集成了一个先进的模拟基础设施,用于验证实现和执行设计空间探索。图8展示了Vortex模拟栈,它包括四个模拟环境:1) OPAE驱动:使用Intel专有的AFU模拟环境来模拟完整设计;2) VLSIM驱动:使用Verilator模拟完整的RTL设计,并在软件中实现AFU接口和内存模拟;3) RTLSIM驱动:模拟不带命令处理器的处理器RTL,以模拟主机和加速器共享同一内存接口的SOC环境;4) SIMX驱动:为Vortex实现了一个周期级模拟器,非常适合体系结构设计空间探索。所有驱动共享一个公共API,应用程序在平台上执行时(无论是针对实际FPGA还是特定模拟器)都使用该API。

5 软件支持

5.1 Vortex驱动栈

        Vortex软件栈主要集成了一个用于处理内核接口以通过PCIe总线访问FPGA的驱动。图9显示了FPGA驱动的连接方式。

        我们使用OPAE(一个轻量级用户空间开源C库)作为驱动,将FPGA资源抽象为一组可供主机上软件访问的功能特性。它负责配置FPGA,以及向/从FPGA上的RAM读写指令和数据。它使用CCI-P协议分配一个共享内存空间(AFU和主机均可访问)用于数据传输。数据从共享空间读取并写入FPGA本地内存。然后复位Vortex以开始执行,一旦操作完成,结果存储在本地内存中。随后使用MMIO将结果数据从本地内存移动到主机可访问的共享空间。

5.2 OpenCL编译器和运行时

        OpenCL是Vortex上支持的主要并行API。我们使用POCL开源框架来实现OpenCL的编译器和运行时软件。修改了POCL编译器的后端以生成针对Vortex ISA的内核程序,并修改了POCL运行时以访问Vortex驱动,从而通过PCIe与FPGA通信。

5.3 Vortex原生运行时

        Vortex软件栈实现了一个原生运行时,向在Vortex上运行的内核程序暴露由RISC-V ISA扩展提供的新SIMT功能以及基本的资源管理API。图10展示了运行时系统的概览。我们在POCL编译期间将运行时库与OpenCL内核静态链接。

        我们修改了POCL运行时,在其通用设备接口中添加了一个新的设备目标以支持Vortex。这个新的设备目标本质上是POCL基本CPU目标的一个变体,移除了对pthreads和其他操作系统依赖的支持,以面向NewLib接口。我们还修改了用于执行工作项的单线程逻辑,以使用Vortex的pocl_spawn运行时API。

5.4 POCL后端编译器

        POCL后端编译器负责根据OpenCL内核源代码生成内核二进制文件,如图11所示。我们修改POCL以实现以下目标:(1) 通过添加新设备和编译器支持来支持RISC-V(RISC-V支持的细节在[13]中讨论);(2) 支持新的Vortex指令;(3) 与Vortex运行时系统集成。

5.5 图形支持

        Vortex图形API实现了OpenGL-ES规范,其中几何处理在主机处理器上运行,而光栅化流水线作为内核在Vortex并行架构上运行。在主机上运行几何处理允许加速器将其处理资源完全用于计算和内存更密集的光栅化任务。光栅化器实现了基本的点、线和三角形图元,以及片段处理(包括深度、模板、雾化和Alpha测试)。纹理采样通过新的tex指令进行加速,该指令作为片段着色器的一部分执行。光栅化器的实现遵循Larrabee的瓦片渲染算法,光栅化瓦片在主机上生成。

        图12展示了Vortex程序的编译流水线概览,其中包括编译图形着色器的步骤。LunarGLASS编译器内部使用LLVM Clang作为其前端的一部分,将源内核代码处理成LLVM IR(通过SPIR-V到LLVM IR的转换)。LLVM-IR程序连同额外信息(包括Vortex运行时和图形内核模板)被传递给LLVM编译器,以生成最终的Vortex二进制文件。图13展示了一个内核代码片段,该内核调用了一个带纹理过滤的着色器。纹理采样器状态通过CSR进行编程(第3-9行);然后,内核在可用的硬件线程上派生着色器执行(第19行)。

// 图13:带纹理渲染的示例内核代码
1 int main (kernel_arg_t *arg) {
2     // 配置纹理单元
3     csr_write(TEX_ADDR(0), arg->src_ptr);
4     csr_write(TEX_MIPOFF(0), 0);
5     csr_write(TEX_WIDTH(0), arg->srcW);
6     csr_write(TEX_HEIGHT(0), arg->srcH);
7     csr_write(TEX_FORMAT(0), arg->format);
8     csr_write(TEX_WRAP(0), arg->wrap);
9     csr_write(TEX_FILTER(0), arg->filter);
10
11    shader_state_t state;
12    state.arg = arg;
13    state.tileW = arg->dstW;
14    state.tileH = arg->dstH;
15    state.deltaX = 1.0f / arg->dstW;
16    state.deltaY = 1.0f / arg->dstH;
17
18    // 启动渲染任务
19    spawn_tasks(shader, state);
20 }

6 评估

6.1 实验设置

        我们的评估平台主机处理器采用 3.5 GHz 的 Intel Xeon E5-1650。对于基准测试,我们使用了 Rodinia OpenCL 内核的一个子集。我们将基准测试分为两类:计算密集型组(包括 sgemm、vecadd 和 sfilter)和内存密集型组(包括 saxpy、nearn、gaussian 和 bfs)。为了评估纹理引擎,我们使用了三个合成基准测试来运行支持的过滤模式,包括点采样、双线性过滤和三线性过滤。纹理基准测试均使用 1080p 源纹理作为输入,并将其渲染到相同大小的目标渲染目标中。我们在 Intel Arria 10 GX FPGA 和速度等级为 2 的 Intel Stratix 10 FPGA 上对 Vortex RTL 进行了综合。

6.2 微体系结构

6.2.1 设计空间配置

         在 Vortex 设计中,我们可以通过增加线程数量或增加波阵面数量来提高数据级并行度。增加线程数量类似于增加 SIMD 宽度,需要对硬件进行以下更改:1) 增加 GPR 存储器的读写宽度;2) 增加 ALU 数量以匹配线程数;3) 增加 GPR 读取阶段之后每个流水线阶段的寄存器宽度;4) 增加缓存和共享内存中所需的仲裁逻辑以检测存储体冲突和处理缓存缺失;5) 增加 IPDOM 条目数量。增加波阵面数量不需要增加 ALU 数量,因为 ALU 在波阵面之间是复用的。增加波阵面数量需要对硬件进行以下更改:1) 增加波阵面调度器的逻辑;2) 增加 GPR 表的数量;3) 增加 IPDOM 栈的数量;4) 增加寄存器记分牌的数量;5) 增加波阵面表的大小。需要注意的是,增加波阵面的成本取决于该波阵面中的线程数量;因此,对于较大线程配置,增加波阵面的成本会更高。这是因为每个 GPR 表、IPDOM 栈和波阵面表的大小都依赖于线程数量。

        表 3 显示了一个处理器核心在不同配置下(即增加波阵面数量如 4W、8W,或增加线程数量如 4T、8T)的面积成本。图 14 显示了不同配置下的相应性能。从 4W-4T 配置转向 2W-8T 配置(最大化线程数),导致 LUT 和寄存器的面积成本增加 69%,同时 sgemm 的性能加速了 20%。然而,将配置改为 8W-2T(最大化波阵面数)生成的硬件成本更低,面积减少了约 27%。这伴随着 IPC 性能的下降,在极端情况下 sgemm 的 IPC 下降了 36%。8W-4T 配置有一定的性能提升,且面积成本相对较低。我们选择 4W-4T 配置主要是为了在目标 FPGA 上能够扩展到 16/32 个核心,同时获得良好的性能。

6.2.2 面积成本

         我们成功地在 Intel Arria 10 FPGA 上实现了最多 16 个核心的基线处理器配置,在 Intel Stratix 10 FPGA 上实现了最多 32 个核心的配置,并在 200 MHz 时钟速度下实现了最多 32 个核心的扩展。

        表 4 显示了处理器在不同核心配置下的综合摘要,图 15 显示了主要组件所占面积的细分。在 8 核心配置下,Arria 10 FPGA 逻辑资源的 53% 被使用,这部分成本主要被纹理单元和缓存(L1 缓存和共享内存各 16KB)占用。FPU 面积相对较低,因为我们利用了器件上现有的浮点 DSP 块进行 FMA 计算。

6.2.3 性能扩展

         图 18 显示了 Vortex 处理器在 FPGA 上不同核心配置下以 IPC 衡量的性能扩展情况。对于计算密集型基准测试,IPC 随着处理器核心数量的增加几乎呈线性增长。对于内存密集型基准测试,除了 nearn 程序(其内核内部有一个开销大的长延迟浮点平方根操作,因此也属于计算密集型)外,其他测试的 IPC 也随着核心数量的增加而有所提升。

6.3 高带宽缓存

        我们分析了基线 4W-4T 处理器配置的高带宽缓存性能。在此设置中,我们仅关注单核性能,并改变数据缓存存储体上的虚拟端口数量。需要指出的是,只有数据缓存实现了虚拟多端口技术。指令缓存不需要,因为 SIMT 执行每个周期只需要取一条指令。表 5 显示了一个 4 体数据缓存在启用 1 端口、2 端口和 4 端口虚拟多端口时的综合摘要。4 端口是可能的最大设置,这改善了最坏情况(即所有四个请求都指向同一个存储体并占用该存储体上的四个独立虚拟端口)。端口数从 1 增加到 2 导致逻辑面积增加 9%,从 1 增加到 4 导致逻辑面积增加 25%。图 19 显示了每种虚拟端口配置下的数据缓存存储体利用率。100% 的存储体利用率意味着所有发出的请求都没有直接经历存储体冲突,并且所有停顿都源于存储体输入 FIFO 已满。sgemm 和 vecadd 是两个主要经历高存储体冲突的基准测试,其存储体利用率分别为 67% 和 71%。增加虚拟端口数量可以线性地将这些基准测试的存储体利用率提高到 100%。图 19 显示了每个虚拟端口配置下各基准测试的性能,我们观察到 sgemm 从此优化中受益显著,vecadd 的 IPC 也有小幅提升,但由于图表比例关系变化不明显。2 端口配置在提升的利用率和成本之间取得了最佳平衡。

6.4 纹理采样

        我们对纹理加速的评估基于直接运行定制硬件的合成基准测试。我们评估了点采样、双线性采样和三线性采样。如第 4.2.1 节所述,三线性采样是作为围绕加速的双线性采样器的伪指令实现的。我们将 Vortex 硬件加速与无加速(纹理单元完全在软件中实现)的渲染流水线进行了比较。图 20 显示了在不同处理器核心配置下,软件与硬件纹理加速的性能差异。我们观察到点采样在所有核心配置下的差异微乎其微。这是预期的,因为如第 4.2.1 节所述,点采样加速与双线性采样共享采样过滤器后端以减少面积成本,而且该特性不常用。此外,本实验中使用的源纹理是 RGBA 格式,意味着无需格式转换,导致点采样的软件代码变成了简单的复制操作。另一方面,双线性过滤显示出更大的改进,在内存带宽不那么饱和的单核情况下有近 2 倍的加速。随着核心数量的增加,由于内存带宽限制,加速比略有下降。三线性过滤在硬件加速下也表现更好,尽管其增益不如双线性过滤明显,这主要是由于内存带宽的限制,因为三线性过滤使内存请求数量翻倍。单独看纹理加速,我们也观察到随着核心数量增加,内存争用带来的影响。

6.5 在体系结构研究中使用 Vortex

        Vortex 基础设施在 FPGA 上提供了完整的 GPU 栈实现,使得能够在桌面和 SoC 环境中探索跨应用程序、编译器、驱动程序和硬件栈的全系统优化。据我们所知,这是首个支持 PCIe 接口的软 GPU 实现,这为处理 CPU/GPU 通信、命令缓冲区管理和内核卸载开辟了新的场景。其连接到 FPGA 多体存储系统的高带宽缓存子系统为探索内存优化提供了一个坚实的平台。Vortex 可以轻松扩展以在基于 HBM 的 FPGA 上进行评估,从而进一步评估不同的内存系统。第 4.5 节中的模拟工具使得能够对无法在 FPGA 上实现的更复杂体系结构进行设计空间探索。图 21 展示了在使用 SIMX 和基线 RTL 设计参数增加内存延迟和带宽时,一个 16 核、16 波阵面、16 线程处理器配置的内存扩展效果。

6.6 将 Vortex 移植到 ASIC 设计流程

        一个坚实的模拟平台加上全面的 FPGA 原型设计环境,为探索 ASIC 开发提供了强大的基础设施。在 Vortex 开发早期,我们使用 15 纳米教学用单元库综合了一个 8 波阵面-4 线程单核 Vortex 配置,获得了一个在 300 MHz 下运行、功耗为 46.8mW 的设计。(GDS 版图和功耗分布分别见图 16 和图 17)。然而,Vortex 的微体系结构是针对 FPGA 优化的,将设计移植到 ASIC 需要进行更改以解决与 FPGA 的平台差异,例如时钟树、复位分布、电源管理、存储器和性能,这超出了我们当前工作的范围。

7 相关工作

        表 6 将 Vortex 与其他开源 GPGPU 实现进行了对比,突出显示了所提供的特性和性能特征。每个项目的细节及与 Vortex 的比较总结如下。

7.1 支持 GPGPU/GPU 的 RISC-V 扩展

        HWACHA 和 ARA 是基于 RISC-V 的协处理器,实现了 SIMD 执行模型,其中向量指令被流式传输到向量通道中。它们的设计基于开源的 RISC-V 向量 ISA 扩展提案,利用了其向量长度无关的 ISA 和宽松的体系结构向量寄存器。

        Simty 实现了一种支持 SIMT 执行的专用 RISC-V 体系结构,与 Vortex 类似。然而,在作者的工作中,仅将微体系结构作为概念验证实现,没有任何软件栈。

7.2 基于 FPGA 的 GPU

        MIAOW 是一个 FPGA 软 GPU,实现了 AMD Southern Islands GPGPU ISA,能够运行未经修改的基于 OpenCL 的应用程序。作者提出了一种部分体系结构,其中大部分片上网络和内存子系统是模拟的。他们的主要目标是为用 RTL 编写的组件提供最接近真实的参考体系结构实现。另一方面,Vortex 的目标不是复制特定的 GPGPU 体系结构,而是提供一个完整的、针对 FPGA 优化的可比实现。此外,MIAOW 不支持图形处理。

FlexiGrip、FGPU 和 Harmonica 也是为 FPGA 实现的软 GPU。它们都具有基于 SIMT 的体系结构,但都有自己定制的 ISA,这需要移植现有的应用程序和基准测试。它们不支持图形处理。

7.3 支持渲染的软 GPU

        NyuziRaster 是一个支持图形渲染的开源软 GPU。NyuziRaster 集成了一个简单的多线程顺序处理器,支持自定义 ISA。NyuziRaster 没有实现任何纹理单元,完全在软件中进行纹理采样。NyuziRaster 实现了一个固定功能的光栅化器,不支持可编程着色器。Vortex 通过 OpenGL 支持可编程着色器,这些着色器在其计算平台上作为并行瓦片执行。它还具有硬件加速的纹理采样。NyuziRaster 在其处理器设计中最多支持 4 个线程,而 Vortex 在 FPGA 上可扩展至总共 512 个线程。

8 结论

        通过利用围绕 RISC-V 快速发展的开源社区以及开源的 LLVM 和 POCL 编译器,Vortex 试图为 GPGPU 研究提供一种整体方法,该方法允许在硬件和软件栈的任何部分探索新想法。通过其最少的 ISA 扩展,Vortex 实现了 GPGPU 功能和 3D 图形加速。这一点,加上其高带宽缓存和弹性流水线,使得设计能够在 FPGA 上实现高频率运行。可配置的 RTL 和紧密耦合的运行时栈允许进行快速而灵活的实验,我们希望从我们展示的各种评估指标中能明显看出这一点。我们相信这将允许越来越多样化和复杂的工作负载部署在 Vortex 上,从而催生对更现实和更有意义的场景的研究。对于未来的工作,我们计划扩展 Vortex 的编译器和运行时软件以支持 CUDA 和 Vulkan API。对 ASIC 设计流程的支持也是实现芯片制造的重要路线图。

9 献词

        我们将此项工作献给我们伟大的导师、同事、良师和亲爱的朋友 Sudhakar Yalamanchili 教授,以表纪念。这个项目始于他构建一个用于研究的开源 GPU 框架的愿景。

致谢

        这项工作得到了橡树岭国家实验室和 SiliconArts 的部分支持。我们衷心感谢英特尔公司以及 NSF CCRI 2016701、NSF CNS 1815041 为提供 FPGA 资源给予的支持。我们要感谢 Ruei Ting Chien, Kanghong Yan, Will Gulian, Jaewoong Sim, Liam Cooper, Xingyang Li, Malik Burton, Carter Montgomery, Da Eun Shim, Priyadarshini Roshan, Jaewon Lee, Ethan Lyons, Roye Eshed, Taejoon Park, Lingjun Zhu, Sung Kyu Lim, Han Ruobing 对 Vortex 项目开发做出的贡献。我们还要感谢 HPArch 小组成员、Jeff Young、Seyong Lee、Jeff Vetter、Chad Kersey 以及匿名审稿人对改进本文提出的宝贵意见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做网站广告语适合女孩做的网站

vscode-drawio简介网络之大,人才百出,在开源背景下,一些功能只有你想不到,没有做不到。这不,对于写代码的程序员来说,竟然也可以在VSCode IDE里边写代码,边画逻辑流程图了。最近,在g…

湖南省房屋和城乡建设部网站有了网站怎么做app吗

文章目录 0. 引言1. 目标:ZeroMQ与Fast-DDS性能对比2. ZeroMQ vs Fast-DDS - 延迟基准测试2.1 一对一发布-订阅延迟2.2 一对多发布-订阅延迟 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试4. 方法论5. 结论6. 参考 0. 引言 高要求的分布式系统催生了对轻量级且高性能中间…

通过AWS SSO设备代码认证进行AWS凭证钓鱼攻击(2024年更新)

本文详细分析了AWS SSO设备代码认证机制存在的钓鱼攻击风险,通过具体代码演示攻击流程,并提供了CloudTrail日志检测方案。文章指出这种设计缺陷会绕过MFA等安全机制,同时给出了具体的防御建议和凭证撤销方法。通过A…

wireshark 过滤

wireshark 过滤 IP地址过滤 ip.addr == 192.168.1.202ip目的地地址过滤 ip.dst==192.168.1.202端口过滤udp.port==8080udp.srcport==8080udp.dstport==8080 搜索栏输入“not gvsp and not icmp” ,把 ARP、UDP 协议过…

解码数据结构栈

栈的概念与特性 栈是线性结构的特殊形式,其设计初衷是解决 “数据需按特定顺序存取” 的场景(如函数调用、括号匹配),核心遵循 “后进先出”(LIFO,Last In First Out)原则,是计算机领域中最基础的数据结构之一…

vs 2008 建立网站汕头有几个区几个县

七燕论文是一个非常好用的论文写作工具,它不仅可以帮助学生提高写作效率,还能帮助他们避免抄袭和提高论文质量。七燕论文的查重降重功能非常靠谱,能够帮助用户检测论文中的重复内容,并提供相应的修改建议,确保论文的原…

第七章 手写数字识别V4

# 优化: # 增加父类Module,输出每层信息 # 增加ReLU类,Tanh类 # 增加Dropout类,随机失活,防止过拟合,提高泛化能力 # 增加Parameter类,保存权重和梯度# 导入必要的库 import numpy as np import os import stru…

什么?你的蓝牙用不了了?

什么?你的蓝牙用不了了?如果你的电脑蓝牙出现一下问题:蓝牙图标不见? 搜索不到任何设备? 只能搜到手机不能搜到耳机? 看看本篇文章给你的解决办法把!蓝牙图标不见 暂未解决。 搜索不到任何设备 首先,同时按下 …

个人可以做电影网站吗信用徐州网站建设情况

黑马程序员上海中心学姐微信:CZBKSH关注咳咳,今天学姐就来和你们说说Spring对于Java程序员的重要性。首先,Spring 官网首页是这么介绍自己的——“Spring: the source for modern Java”,这也意味着 Spring 与 Java 有着密切的关系…

做韦恩图的在线网站wordpress下载视频

简单选择排序的介绍:从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的。简单选择排序的基本思想:假定我们的数组为int [] arr new int[n],第一次我们从arr[0]~arr[n-1]中选择出最小的…

2025/9/27

2025/9/271.完成课后任务:验证码任务 2.完成课后任务:生成三十道四则运算题

30.Linux DHCP 服务器 - 详解

30.Linux DHCP 服务器 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

C# Smart3D Plate Part零件形状提取

public class ExportPartShape : BaseModalCommand{public override void OnStart(int instanceId, object argument){base.OnStart(instanceId, argument);var symFile = @"C:\Program Files (x86)\Smart3D\Comm…

威海建设局网站首页图片编辑在线

在FTP协议中,可以通过配置服务器端的空闲连接超时时间来设置连接的过期时间。具体步骤如下: 登录FTP服务器,进入服务器的配置文件目录。通常配置文件位于/etc或/etc/vsftpd目录下。打开FTP服务器的配置文件,例如vsftpd.conf。在配…

网站使用微软雅黑小程序模板免费下载

C语言实验lab10C程序设计实验报告学院:国际商学院班级:14电商专业:电子商务姓名:熊靓男日期:15.5.25学号:1420070049实验目的复习一维数组掌握二维数组参数的传递掌握排序算法实验内容消灭怪物在阳光明媚月…

化妆品网站系统规划网站制作排名

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param s string字符串 * param n int整型 * return string字符串*/public String trans (String s, int n) {// write co…

长春网站建设公司会展设计效果图

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 查询数据 条件 逻辑运算符 模糊查询 范围查询 in 判断空 UNION 排序 聚合 分组:group by —————————…

网站开发工程师的证件seo技术专员招聘

本文简单记录一次实践使用过程&#xff0c;涉及presto-mysql,presto-elasticsearch&#xff0c;文中参数未做注释&#xff0c;请参考官方文档&#xff0c;希望能帮到大家1 下载安装 presto-0.228<1>下载服务端客户端相关jar<2>安装&#xff1a;1> 解压tar -zxvf…