Vortex GPGPU的硬件设计和代码结构分析

文章目录

  • 前言
  • 一、GPGPU是什么?
    • 1.1 GPU和GPGPU之间的差异
    • 1.2 GPU和CPU之间的集成方式
    • 1.3 GPU包含什么(列举和VMIPS向量体系结构的差异)
  • 二、Vortex GPGPU是什么?
    • 2.1 Vortex GPGPU的技术边界和验证环境
    • 2.2 Vortex GPGPU的指令集设计(对比GPU的指令集)
    • 2.3 Vortex GPGPU Core的6级流水微架构设计
    • 2.4 Vortex GPGPU的微架构设计
    • 2.5 Vortex GPGPU的Cache串行流水线设计和Cache多端口设计方法
  • 三、Vortex GPGPU代码包含什么?
    • 3.1 Vortex GPGPU的代码结构
    • 3.2 Vortex GPGPU的握手协议
    • 3.3 Vortex GPGPU代码中slave/master规范
    • 3.4 Vortex GPGPU代码支持的debug
  • 总结


前言

这次开始针对Vortex GPGPU进行架构分析、硬件代码分析、仿真代码分析和运行时代码分析。

Vortex GPGPU的官方文档可以见:Vortex GPGPU

Vortex GPGPU的github可见:github,其中vortex包含源码和必要的.md文件,其中vortex_tutorials包含作者在MICRO顶会上汇报的slide

本系列文章首先参考了知乎帖子,在略微深入了解Vortex GPGPU之后就觉得这可能是学习GPGPU系统工作的好机会。同时也为下一个研究工作做准备工作。


一、GPGPU是什么?

1.1 GPU和GPGPU之间的差异

顾名思义,Vortex GPGPU是一种简化版本的GPGPU。在此之前,可以简单回顾GPU的基本知识。(个人建议如果要深入研究GPGPU架构,还是先去把《计算机体系结构:量化研究方法》这一本书内关于数据级并行的知识去回顾一遍)由于GPU除了包含用于加速深度学习中矩阵乘的tensor core和支持其他计算的cuda core之外,还包含图形渲染等技术。GPU在处理视觉密集型任务,如视频游戏、三维动画、图形设计和视频编辑时表现出色。此外,GPU的并行计算能力在科学模拟、数据分析、深度学习和机器学习等领域表现出色。

GPGPUGPU的一个概念,指的是将GPU用于除了图形渲染之外的通用计算任务。GPGPU利用GPU的并行处理能力来加速科学模拟、数据分析和机器学习等计算密集型任务。这种技术允许开发者通过使用专门的编程框架,如CUDAOpenCL,来编写能够在GPU上执行的代码,从而利用GPU的并行架构来加速计算。换句话说,GPGPU专注于使用GPU进行非图形的通用计算任务

1.2 GPU和CPU之间的集成方式

注意GPU图灵完备的,图灵完备是指理论上只要提供足够多的时间和内存,任何计算都可以完成。但是这并不代表GPU可以脱离CPU而存在,这是因为GPU并不是一个独立的计算设备,往往需要和CPU集成在一个芯片内。CPU负责GPU上的计算启动,并将数据传输到GPU上。关于两者的架构图根据场景分为2类:
在这里插入图片描述
图源《General-Purpose Graphics Processor Architecture》

图1.1(a)显示一个包含CPU和GPU的典型系统图,此处GPU“独立GPU”,其中也包括用于连接CPUGPU的总线如PCIECPUGPU分别带有独立的DRAM内存空间CPU的内存空间称为“系统内存System Memory”GPU的内存空间称为“设备内存Device Memory”。并且,“系统内存”“设备内存”通常会使用不同的DRAM技术,比如CPU使用DDR(这是因为CPU优先优化DDR的访问延迟),GPU使用GDDR(这是因为GPU优先优化GDDR的访问吞吐量)。

图1.1(b)是一个典型的集成CPU和GPU的逻辑图,比如AMDBristol Ridge APU或者移动设备的GPU“移动GPU”),此处的CPUGPU使用单一的DRAM内存空间,因此必须使用相同的内存技术,由于集成CPU和GPU的芯片出现在低功耗移动设备上,所以对这种内存的优化往往针对功耗展开(LPDDR)。

1.3 GPU包含什么(列举和VMIPS向量体系结构的差异)

现在来看看GPU包含了什么?
在这里插入图片描述
在这里插入图片描述
包含指令缓存warp调度程序SIMD车道或者说线程处理器各个层次的存储器互连网络等。

一个高度抽象的全架构图如下:
在这里插入图片描述

类似于向量体系结构GPU有类似概念。

网格:在GPU上执行的可向量化循环,由一个或者多个可以并行执行的线程块组成。
线程块block:可以在多线程SIMD处理器上执行的向量化循环,由1个或者多个SIMD指令线程组成。它们可以通过局部存储器通信。
CUDA线程:对应于1个SIMD车道上执行的1个元素。
Warp:一种传统线程,仅包含多线程SIMD处理器上执行的SIMD指令。
PTX:在多个SIMD车道上执行的1条SIMD指令。
SM流式多处理器:多线程SIMD处理器执行SIMD指令的线程,和其他SIMD处理器无关。
Warp调度程序:当SIMD指令线程做好准备后,用于调度发射这些线程的硬件,包括一个计分板,用于跟踪SIMD线程执行。

关于threadblockwarp之间的差异见:
在这里插入图片描述

另外注意GPU有2级硬件调度程序

  1. 线程块调度程序:将线程块分配给多线程SIMD处理器,确保线程块被分配给其局部存储器拥有相应数据的处理器;
  2. SIMD处理器内部的SIMD线程调度程序(就是Warp调度程序),用以调度何时运行SIMD指令线程。

当然GPU向量体系结构这两者也是有差异的:

GPU 向量体系结构
共同点1、可以解决数据级并行问题;2、都拥有Gather-Scatter数据传送;3、都支持mask寄存器;
差异点1、GPU的寄存器数量要比VMIPS多;2、由于没有一种接近的标量处理器,GPU有时会在运行时以硬件实现一些功能,VMIPS通常在编译时用软件来实现这些功能;3、与大多数VMIPS不同的是,GPU还依赖单个“多线程SIMD处理器“中的”多线程“来隐藏存储器延迟;

展开SIMD车道
在这里插入图片描述
其余关于GPU怎么处理分支,为什么引入mask寄存器等之后有需补充。

二、Vortex GPGPU是什么?

2.1 Vortex GPGPU的技术边界和验证环境

在这里插入图片描述
以上是Vortex GPGPU团队提出的GPGPU架构,整个系统包括Host端和GPGPU Processor端,Host端通过设计两种不同平台的驱动来支持AMDOpenCLNVIDIACUDA,事实上作者开发了不止一种驱动,根据底层环境分为四种,后面再展开!在CUDAOpenCL运行时之上就是两类程序。而在Processor端,作者做了层级设计,包括计算和存储。存储包含设备内存共享memoryRegister File,计算层面则通过设计多个Core实现高度数据级并行,图示中的AFU是用于Host端给GPGPUmulti-banking DRAM填充数据的单元。Core的架构细节包括Warp调度程序单元取指译码寄存器堆ALUFPULSUSFU共享存储。彼此之间的连接关系见后面。

在这里插入图片描述
以上是Vortex GPGPU设计的验证环境。

1、最右侧是作者团队设计的一个周期精确Vortex GPGPU模拟器,基于SIMX Driver驱动支持Vortex应用程序的运行。
2、从最右侧过来,左边第一个是纯Vortex GPGPU的验证环境,作者借助Verilator这个开源波形验证工具向上搭建RTLSIM驱动来支持Vortex应用程序的运行。
3、再往左边过来就是,使用AFU实现基本的数据可供给的系统,作者依旧借助Verilator这个开源工具向上搭建VLSIM驱动来支持Vortex应用程序的运行。
4、最左侧就是在FPGA平台上基于OPAE驱动来支持Vortex应用程序的运行。

这样的验证环境对我本人来说,是全新的。因此,对我而言,有愈发学习框架和代码的必要性。(此前,我只知道最左侧的验证环境和软件开发流程

2.2 Vortex GPGPU的指令集设计(对比GPU的指令集)

在这里插入图片描述
上述只列举了部分RISC-V指令集扩展,主要是控制流指令
对比《计算机体系结构:量化研究方法》上的指令集:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 Vortex GPGPU Core的6级流水微架构设计

在这里插入图片描述
首先这个和超标量处理器类似,属于多发射的处理器。作者自己定调是6级顺序发射-乱序接收的GPGPU。每一级流水功能见下面图片:
在这里插入图片描述
这是调度阶段,包括前述提到的Warp调度程序Warp Table。关于IPDOM(Immediate Postdominator) TableInflight Tracker,根据官网论文的细节看:
IPDOM Table是为了解决SIMT(单指令多线程)处理器中的控制流分歧问题。具体来说是因为:

控制流分歧导致性能降低:控制流分歧发生在同一个硬件warp中的线程想要执行不同的指令路径时。由于线程可能因为条件判断、循环等操作而产生不同的执行流程,这会导致SIMT处理器中的某些线程空闲,从而降低流水线的利用率。如果不加以处理,控制流分歧会导致处理器性能的显著下降。

IPDOM Table怎么解决这个问题:为了解决这个问题,引入了IPDOM栈。IPDOM栈的作用是跟踪warp中线程的执行状态,以便在发生控制流分歧时能够恢复到正确的执行路径。具体来说,每个warp都有一个私有的线程掩码寄存器,该寄存器存储当前正在运行的线程的掩码。当执行到分割指令时,当前线程掩码的状态、新线程掩码的逆,以及下一条指令的地址(PC+4)会被推入到IPDOM栈中。当执行合并指令时,会从IPDOM栈中弹出这些信息,以恢复到正确的执行状态。

IPDOM Table引入的好处:引入IPDOM栈的目的是为了简化硬件设计,同时有效处理控制流分歧。通过维护一个栈来跟踪和恢复执行状态,可以在不显著增加硬件复杂度的情况下,解决控制流分歧带来的性能问题。这种设计允许SIMT处理器更高效地处理线程执行中的条件分支和循环,提高了处理器的整体性能和利用率。

Inflight Tracker主要是为了跟踪in flight指令,也就是跟踪执行中的指令。

Warp Scheduler:
1、Schedule the next PC into the pipeline
2、Track stalled, active warpsIPDOM Stack
1、Save split/join states for divergent threadsInflight Tracker
1、Track in-flight instructions

在这里插入图片描述
这是取指阶段,包括设计Cache,处理ICache请求和响应。作者额外设计了预防死锁的设计(具体细节看代码的时候展开)。

1、Retrieve instructions from memory
2、Handle I-cache requests/responses

在这里插入图片描述
这是译码阶段,主要负责分析指令的各个field,从而确定操作类型操作数

1、Decode fetched instructions
2、Notify warp scheduler on control instructions

在这里插入图片描述
这是发射阶段,包括指令buffer、计分板、寄存器堆和操作数分发。

IBuffer
1、Store decoded instructions in separate per-warp queuesScoreboard
1、Track in-use registers
2、Check register use for decoded instructionsOperands Collector
1、Fetch the operands for issued instructions from the register file

在这里插入图片描述
这是执行阶段,包括四大类Cluster

ALU Unit
1、Handle arithmetic and branch operationsFPU Unit
1、Handle floating-point operationsLSU Unit
1、Handle load/store operationsSFU Unit
1、Handle warp control operations
2、Handle Control Status Registers (CSRs) operations

注意执行阶段还包括:DispatchGather单元。
在这里插入图片描述

在这里插入图片描述
这是回收阶段,用于获取执行完的结果,并完成写回到cache的操作。

Commit
1、Write result back to the register file and update the Scoreboard.

2.4 Vortex GPGPU的微架构设计

在这里插入图片描述
计算部分的层次不过多解释!

2.5 Vortex GPGPU的Cache串行流水线设计和Cache多端口设计方法

在这里插入图片描述
这是个很典型的cache设计,包括TagData部分。可以先简单回顾Cache的流水设计,以下图来自《超标量处理器设计》:
在这里插入图片描述
一个4路组相联的cache设计如上,访存地址分为TagIndexBlock OffsetIndex用于选中4路中的哪一行,也就是选中Tag Memory中某一行,随后使用Tag来确定是否命中了4路中的某一路,如果命中,则接下来在Data Memory对应的路中根据Block offset选中某个cacheline data block
用于cache的并行化访问流水(这里的并行指的是对Tag MemoryData Memory的并行访问,同理后面提到的串行也是这两者的串行访问)
在这里插入图片描述
在这里插入图片描述
一般来说,会倾向于选择串行访问,原因是减少了MUX的数量,因为在现代CPU中,L1 ICache一般采用4路组相联(我们以intel i4为例),L1 DCache一般采用8路组相联L2 Cache同样会采用8路组相联。因此高相联度的cache必然会带来多路选择器,而串行访问明显降低了对2个memory访问延迟。当然缺陷也是明显的,就是增加了load指令的延迟,因为多了一拍。

世界线收束一下!
在这里插入图片描述
单从这张图可以看出作者采用了Tag MemoryData Memory串行流水线设计。与此同时,作者提到为了适应多发射的需要,引入virtual multi-porting的设计。通常cache因为面积本来就很大,很少考虑True multi-porting设计。因为端口数量增加会导致面积增加。尽管如此,但是还是能接受,因为对于ICache而言,需要每个周期读取多条指令,多端口设计基本可以保证每拍都可以取出指令。当然发射的指令数量完全取决于一次取多少cacheline block字节的对齐程度

在超标量处理器中,会有一些部件考虑使用True multi-porting,比如Register FileROBIssue Queue,但这些部件容量本身就不大。

相比之下,DCache采用这个方案对访问延迟和面积都有极大的消极影响。一般的处理方案是multi-banking,以AMD Opteron为例:
在这里插入图片描述
multi-banking的形式有利于分割开物理存储,减少访问竞争。一张更形象的图是:
在这里插入图片描述
使用多体交叉的方式来支持多端口访问。

至于这里提到的virtual multi-porting设计方法,不太理解为什么作者将DCacheICache都进行了同样处理(这一点先存疑,但感觉大概率是进行了同样操作,后续等读完代码后再来澄清这个问题)。为什么这么设计,作者也提到了优势,可能具体有多好还得回到代码中去看看。

三、Vortex GPGPU代码包含什么?

3.1 Vortex GPGPU的代码结构

在这里插入图片描述
在这里插入图片描述
这里提到在FPGA上的部署,我简单看了作者代码,大概率是可以支持Vortex GPGPUZYNQ构建SoC,作者并未套用Xilinx提供的axi full封装代码,而是自己重构了。这可能是本源码的第不知道多少个值得学习的地方。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个是基于Intel的开发板,一个是基于xilinx的开发板。作者提到了具体支持的板子类型:
在这里插入图片描述
世界线收束!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 Vortex GPGPU的握手协议

在这里插入图片描述
只是截个图,保证后面看代码的时候没遗漏细节!

3.3 Vortex GPGPU代码中slave/master规范

在这里插入图片描述

3.4 Vortex GPGPU代码支持的debug

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

本文简单回顾GPU和CPU之间的集成方式,GPU和GPGPU之间的差异,同时根据经典书籍展开GPU的基本知识,并与VMIPS进行对比。随后展开Vortex GPGPU的架构设计细节,并同时深入分析了作者设计的4种验证环境。最后简单展开Vortex GPGPU的源码结构。

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

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

相关文章

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时,遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行,并且导致应用强制关闭。 一…

p11函数和递归

递归与迭代 求n的阶乘。&#xff08;不考虑溢出&#xff09; int Fac1(int n) {int i0;int ret1;for(i1;i<n;i){ret*i;}return ret; } int main(){//求n的阶乘int n0;int ret0;scanf("%d",&n);retFac1(n);printf("%d\n",ret);return 0; } int Fac…

unity知识点 专项四 一文彻底说清楚(锚点(anchor)、中心点(pivot)、位置(position)之间的关系)

一 概述 想要使UI控件在屏幕中达到正确的显示效果&#xff0c;比如自适应屏幕尺寸、固定边距等等&#xff0c;首先要理清楚几个基本概念和设置&#xff1a;锚点(anchor)、中心点(pivot)、位置(position)、UI缩放模式、父物件的transform设置 二 Anchor、Pivot与Position 2…

网络连接线相关问题

问题1&#xff1b; 直通线为什么两头都是T568B&#xff1f;是否可以两台T5568A&#xff1f;或者任意线序&#xff0c;只需两头一致&#xff1f; 不行&#xff0c;施工规范规定。&#xff08;原因&#xff1b;网线最长距离100m&#xff0c;实际用起来要把网线包管&#xff0c;走…

【分布式系统】Filebeat+Kafka+ELK 的服务部署

目录 一.实验准备 二.配置部署 Filebeat 三.配置Logstash 四.验证 一.实验准备 结合之前的博客中的实验 主机名ip地址主要软件es01192.168.80.101ElasticSearches02192.168.80.102ElasticSearches03192.168.80.103ElasticSearch、Kibananginx01192.168.80.104nginx、Logs…

iperf3: error - unable to connect to server: No route to host

1.确认iperf3版本是否统一。 2.确认防火墙是否关闭。 关闭防火墙 : systemctl stop firewalld 查看防火墙状态: systemctl status firewalld 3.重新建起链接

自动驾驶算法———车道检测(一)

“ 在本章中&#xff0c;我将指导您构建一个简单但有效的车道检测管道&#xff0c;并将其应用于Carla 模拟器中捕获的图像。管道将图像作为输入&#xff0c;并产生车道边界的数学模型作为输出。图像由行车记录仪&#xff08;固定在车辆挡风玻璃后面的摄像头&#xff09;捕获。…

【ZIP压缩大揭秘】轻松掌握ZIP分卷压缩包的高效解压秘籍!

在这个信息爆炸的时代&#xff0c;文件大小常常成为我们分享与存储的绊脚石。幸运的是&#xff0c;ZIP分卷压缩技术如同一把钥匙&#xff0c;巧妙地将庞然大物分解成小巧易管理的部分。但面对这一串分卷压缩包&#xff0c;你是否也曾迷茫于如何高效解压&#xff0c;恢复文件的完…

解码Python字符串:‘r‘、‘b‘、‘u‘和‘f‘前缀的全面指南

&#x1f4d6; 正文 1 字符串前加’r’ 表示原始字符串&#xff0c;消除转义 print(abc\nde) # abc # deprint(rabc\nde) # abc\nde在下面这个列子中&#xff0c;如果不在路径字符串前面加r那么&#xff0c;路径中的空格就会出现问题 print(rD:\01 programming\09python\py…

全志A527 T527 cat /proc/cupinfo没有Serial问题

1.前言 我们有些客户是使用cpuinfo节点去获取系统的cpuid的,如下: cat /proc/cupinfo processor : 0 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU impleme…

系统吃swap问题排查

目录 背景 问题 分析并解决 1.控制线程数 2.更换IO组件 3.Linux进程信息文件分析 总结加餐 参考文档 背景 隔壁业务组系统是简单的主从结构&#xff0c;写索引的服务(主)叫primary&#xff0c; 读索引并提供搜索功能的服务(从)叫replica。业务线同步数据并不是平滑的&…

static的理论学习

在说到static之前&#xff0c;需要先明确变量类型&#xff1a; 而在聊到变量类型之前我们可以将变量的两个属性好好学一学 变量的两个属性 作用域&#xff08;scope&#xff09;&#xff1a; 从内存的角度来看&#xff0c;就是变量存放在栈&#xff08;stack&#xff09;中&…

TypeError: Cannot read properties of null (reading ‘nextSibling‘)

做项目用的Vue3Vite, 在画静态页面时&#xff0c;点击菜单跳转之后总是出现如下报错&#xff0c;百思不得其解。看了网上很多回答&#xff0c;也没有解决问题&#xff0c;然后试了很多方法&#xff0c;最后竟然发现是template里边没有结构的原因。。。 原来我的index.vue是这样…

ELK+Filebeat+Kafka+Zookeeper

本实验基于ELFK已经搭好的情况下 ELK日志分析 架构解析 第一层、数据采集层 数据采集层位于最左边的业务服务器集群上&#xff0c;在每个业务服务器上面安装了filebeat做日志收集&#xff0c;然后把采集到的原始日志发送到Kafkazookeeper集群上。第二层、消息队列层 原始日志发…

Matlab手搓线性回归-非正规方程法

原理&#xff1a;wxb&#xff0c;x是输入&#xff0c;求得的结果与真实值y求均方误差。 采用链式法则求导 参数更新&#xff0c;梯度下降法&#xff08;批量梯度下降&#xff09; 随机生成数据&#xff1a; m100&#xff1b;生成100个数据&#xff0c;并添加随机噪声 clear; …

基于flask的猫狗图像预测案例

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

二次元转向SLG,B站游戏的破圈之困

文 | 螳螂观察 作者 | 夏至 2023年是B站游戏的滑铁卢&#xff0c;尽管这年B站的游戏营收还有40多亿&#xff0c;但相比去年大幅下降了20%&#xff0c;整整少了10亿&#xff0c;这是过去5年来的最大跌幅&#xff0c;也是陈睿接管B站游戏业务一年以来&#xff0c;在鼻子上碰的第…

鸿蒙语言基础类库:【@ohos.process (获取进程相关的信息)】

获取进程相关的信息 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

昇思13天

ResNet50迁移学习 ResNet50迁移学习总结 背景介绍 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;很少有人会从头开始训练整个网络。普遍做法是使用在大数据集上预训练得到的模型&#xff0c;然后将该模型的权重参数用于特定任务中。本章使用迁移学习方法对Im…

imx6ull/linux应用编程学习(13) CMAKE

什么是cmake&#xff1f; cmake 工具通过解析 CMakeLists.txt 自动帮我们生成 Makefile&#xff0c;可以实现跨平台的编译。cmake 就是用来产生 Makefile 的工具&#xff0c;解析 CMakeLists.txt 自动生成 Makefile&#xff1a; cmake 的使用方法 cmake 就是一个工具命令&am…