news 2026/5/1 9:25:17

08章 平面内存指令 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
08章 平面内存指令 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

平面内存指令将数据片段读入或写出VGPR(向量通用寄存器);波前(wavefront)中的每个工作项(work-item)都会独立执行此操作。与缓冲区(buffer)或图像(image)指令不同,平面指令不使用资源常量(resource constant)来定义内存表面的基地址。相反,平面指令使用来自VGPR的单个平面地址;此地址将内存视为单个平面内存空间进行寻址。该内存空间包括显存(video memory)、系统内存(system memory)、LDS(本地数据共享)内存以及暂存(scratch,私有)内存。它不包括GDS(全局数据共享)内存。平面内存空间的某些部分可能不映射到任何真实内存,访问这些区域会产生内存违规错误。地址所映射到的内存空间的确定由一组"内存窗口"(memory aperture)基地址和大小寄存器控制。

9.1. 平面内存指令

平面内存指令允许内核(kernel)读取或写入内存中的数据,或对已存在于内存中的数据执行原子操作。这些操作通过纹理L2缓存进行。指令声明哪个VGPR保存地址(32位或64位,取决于内存配置),哪个VGPR发送数据,哪个VGPR接收数据。平面指令还使用M0寄存器,如下表所述:

表41. 平面、全局和暂存微码格式

字段位宽描述
OP7操作码(Opcode)。可以是平面、暂存或全局指令。见下表。
ADDR8保存地址的VGPR。对于64位地址,ADDR包含低有效位(LSB),ADDR+1包含高有效位(MSB)。
DATA8保存数据第一个双字(Dword)的VGPR。指令可使用0-4个双字。
VDST8数据返回内核的目标VGPR,可来自LOAD指令或GLC=1的原子指令(返回操作前值)。
SLC1系统级一致性(System Level Coherent)。与GLC结合使用以确定缓存策略。
GLC1全局级一致性(Global Level Coherent)。对于原子指令,GLC:1表示返回操作前值,0表示不返回操作前值。
SEG2内存段(Memory Segment):0=FLAT,1=SCRATCH,2=GLOBAL,3=保留。
LDS1设置时,数据在LDS和内存之间移动,而不是VGPR和内存之间。仅用于全局和暂存指令;对于平面指令必须为零。
NV1非易失性(Non-volatile)。设置时,读/写操作在非易失性内存上进行。
OFFSET13地址偏移量。
暂存、全局:13位有符号字节偏移量。
平面:12位无符号偏移量(最高位被忽略)。

表42. 平面、全局和暂存操作码

平面操作码全局操作码暂存操作码
FLATGLOBALSCRATCH
FLAT_LOAD_UBYTEGLOBAL_LOAD_UBYTESCRATCH_LOAD_UBYTE
FLAT_LOAD_UBYTE_D16GLOBAL_LOAD_UBYTE_D16SCRATCH_LOAD_UBYTE_D16
FLAT_LOAD_UBYTE_D16_HIGLOBAL_LOAD_UBYTE_D16_HISCRATCH_LOAD_UBYTE_D16_HI
FLAT_LOAD_SBYTEGLOBAL_LOAD_SBYTESCRATCH_LOAD_SBYTE
FLAT_LOAD_SBYTE_D16GLOBAL_LOAD_SBYTE_D16SCRATCH_LOAD_SBYTE_D16
FLAT_LOAD_SBYTE_D16_HIGLOBAL_LOAD_SBYTE_D16_HISCRATCH_LOAD_SBYTE_D16_HI
FLAT_LOAD_USHORTGLOBAL_LOAD_USHORTSCRATCH_LOAD_USHORT
FLAT_LOAD_SSHORTGLOBAL_LOAD_SSHORTSCRATCH_LOAD_SSHORT
FLAT_LOAD_SHORT_D16GLOBAL_LOAD_SHORT_D16SCRATCH_LOAD_SHORT_D16
FLAT_LOAD_SHORT_D16_HIGLOBAL_LOAD_SHORT_D16_HISCRATCH_LOAD_SHORT_D16_HI
FLAT_LOAD_DWORDGLOBAL_LOAD_DWORDSCRATCH_LOAD_DWORD
FLAT_LOAD_DWORDX2GLOBAL_LOAD_DWORDX2SCRATCH_LOAD_DWORDX2
FLAT_LOAD_DWORDX3GLOBAL_LOAD_DWORDX3SCRATCH_LOAD_DWORDX3
FLAT_LOAD_DWORDX4GLOBAL_LOAD_DWORDX4SCRATCH_LOAD_DWORDX4
FLAT_STORE_BYTEGLOBAL_STORE_BYTESCRATCH_STORE_BYTE
FLAT_STORE_BYTE_D16_HIGLOBAL_STORE_BYTE_D16_HISCRATCH_STORE_BYTE_D16_HI
FLAT_STORE_SHORTGLOBAL_STORE_SHORTSCRATCH_STORE_SHORT
FLAT_STORE_SHORT_D16_HIGLOBAL_STORE_SHORT_D16_HISCRATCH_STORE_SHORT_D16_HI
FLAT_STORE_DWORDGLOBAL_STORE_DWORDSCRATCH_STORE_DWORD
FLAT_STORE_DWORDX2GLOBAL_STORE_DWORDX2SCRATCH_STORE_DWORDX2
FLAT_STORE_DWORDX3GLOBAL_STORE_DWORDX3SCRATCH_STORE_DWORDX3
FLAT_STORE_DWORDX4GLOBAL_STORE_DWORDX4SCRATCH_STORE_DWORDX4
FLAT_ATOMIC_SWAPGLOBAL_ATOMIC_SWAP
FLAT_ATOMIC_CMPSWAPGLOBAL_ATOMIC_CMPSWAP
FLAT_ATOMIC_ADDGLOBAL_ATOMIC_ADD
FLAT_ATOMIC_SUBGLOBAL_ATOMIC_SUB
FLAT_ATOMIC_SMINGLOBAL_ATOMIC_SMIN
FLAT_ATOMIC_UMINGLOBAL_ATOMIC_UMIN
FLAT_ATOMIC_SMAXGLOBAL_ATOMIC_SMAX
FLAT_ATOMIC_UMAXGLOBAL_ATOMIC_UMAX
FLAT_ATOMIC_ANDGLOBAL_ATOMIC_AND
FLAT_ATOMIC_ORGLOBAL_ATOMIC_OR
FLAT_ATOMIC_XORGLOBAL_ATOMIC_XOR
FLAT_ATOMIC_INCGLOBAL_ATOMIC_INC
FLAT_ATOMIC_DECGLOBAL_ATOMIC_DEC

上述原子指令也有"_X2"版本(64位)。

9.2. 指令

FLAT指令集几乎与缓冲区(Buffer)指令集相同,但没有FORMAT(格式)读写操作。与缓冲区指令不同,FLAT指令不能直接将数据返回到LDS,只能返回到VGPRs。

FLAT指令不使用资源常量(V#)或采样器(S#);但是,它们需要一个SGPR对(SGPR-pair)来保存暂存空间信息,以防任何线程的地址解析为暂存空间。详情参见暂存空间部分。

在内部,FLAT指令同时作为LDS指令和缓冲区指令执行;因此,它们会递增VM_CNT和LGKM_CNT计数器,并且只有在两者都被递减后才被认为完成。无法事先确定FLAT指令是否仅使用LDS或TA内存空间。

9.2.1. 顺序性

平面指令之间可以乱序完成。如果一条平面指令在纹理缓存中找到其所有数据,而下一个平面指令在LDS中找到其所有数据,则第二条指令可能先完成。如果两次取数返回数据到同一个VGPR,则结果未知。

9.2.2. 重要的时序考虑

由于FLAT加载的数据可能来自LDS或纹理缓存,并且这些单元具有不同的延迟,因此在VM_CNT和LGKM_CNT计数器方面存在潜在的竞态条件。因此,在FLAT指令之后唯一合理的S_WAITCNT值是零。

9.3. 寻址

FLAT指令支持64位和32位寻址。地址大小使用模式寄存器(PTR32)设置,并且每个波(wave)存储该值的本地副本。

用于窗口检查的地址在32位和64位模式下有所不同;但此处不涵盖此内容。

64位地址的存储方式为:低有效位(LSB)存储在ADDR指定的VGPR中,高有效位(MSB)存储在ADDR+1指定的VGPR中。

对于暂存空间,纹理单元从VGPR获取地址并执行以下操作:

Address = VGPR[addr] + TID_in_wave * Size - private aperture base (in SH_MEM_BASES) + offset (from flat_scratch)

9.4. 全局指令

全局指令类似于平面指令,但程序员必须确保没有线程访问LDS空间;因此,全局指令不使用LDS带宽。

全局指令提供两种寻址类型:

  • 内存地址 = VGPR地址 + 指令偏移量。

  • 内存地址 = SGPR地址 + VGPR偏移量 + 指令偏移量。

地址组件的大小取决于ADDRESS_MODE:32位或64位指针。VGPR偏移量为32位。

这些指令还允许数据直接在LDS和内存之间移动,而无需经过VGPRs。

由于这些指令不访问LDS,仅使用VM_CNT,而不使用LGKM_CNT。如果全局指令尝试访问LDS,则指令返回MEM_VIOL(内存违规)。

9.5. 暂存指令

暂存指令类似于平面指令,但程序员必须确保没有线程访问LDS空间,并且内存空间是交错(swizzled)的。因此,暂存指令不使用LDS带宽。

暂存指令还支持多双字访问和非对齐访问(尽管非对齐访问速度较慢)。

暂存指令使用以下寻址方式:

  • 内存地址 = flat_scratch.addr + swizzle(V/SGPR偏移量 + 指令偏移量, 线程ID)

  • 偏移量可以来自SGPR或VGPR,并且是32位无符号字节。

地址组件的大小取决于ADDRESS_MODE:32位或64位指针。VGPR偏移量为32位。

这些指令还允许数据直接在LDS和内存之间移动,而无需经过VGPRs。

由于这些指令不访问LDS,仅使用VM_CNT,而不使用LGKM_CNT。暂存指令不可能访问LDS;因此,不会进行错误或窗口检查。

9.6. 内存错误检查

TA(纹理数组)和LDS都可以报告由于错误地址导致的错误。这可能在以下情况下发生:

  • 无效地址(在任何窗口之外)

  • 写入只读表面

  • 数据未对齐

  • 地址越界:

    • LDS访问地址超出范围:[0, MIN(M0, LDS_SIZE)-1]

    • 暂存访问地址超出范围:[0, scratch-size -1]

对于具有错误地址的线程的策略是:超出此范围的写入不会写入值,读取返回零。

来自LDS或TA的地址错误通过它们各自的"指令完成"总线作为MEM_VIOL返回。这会设置波(wave)的MEM_VIOL TrapStatus位,并在相应的EXCPEN位设置时导致异常(trap)。

9.7. 数据

FLAT指令可以在VGPRs和/或内存中使用零到四个连续的双字数据。DATA字段确定哪些VGPR(如果有)提供源数据,而VDST VGPRs保存返回数据(如果有)。不进行数据格式转换。

9.8. 暂存空间(私有)

暂存空间(线程私有内存)是由窗口寄存器定义的内存区域。当地址落在暂存空间中时,硬件会自动执行额外的地址计算。内核必须提供额外信息(以FLAT_SCRATCH寄存器的形式)以便进行此计算。

FLAT_SCRATCH地址会随着每个FLAT请求自动发送。

FLAT_SCRATCH是一个64位字节地址。着色器通过将两个独立的值相加来构成该值:基地址(可以通过初始化的SGPR传递,或通过常量缓冲区传递)和每波分配偏移量(也在SGPR中初始化)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:19:18

低代码PHP组件版本冲突如何破局?3个关键步骤让你无缝升级

第一章:低代码PHP组件的版本兼容在构建现代Web应用时,低代码平台常依赖于可复用的PHP组件来加速开发流程。然而,不同PHP版本之间的语法与函数行为差异可能导致组件运行异常。确保组件在多种PHP环境中稳定运行,是保障系统兼容性的关…

作者头像 李华
网站建设 2026/5/1 6:53:39

旋转矩阵与欧拉角转换数学公式与代码详解

下面分三大部分说明: 数学推导与公式(欧拉角 ↔ 四元数)C 实现代码Python 实现代码 为便于说明,统一采用常用的航空/机器人学约定: 欧拉角顺序:Z-Y-X(yaw-pitch-roll)旋转顺序&#…

作者头像 李华
网站建设 2026/5/1 6:53:38

助力在线教学提质增效,“魔果云课”以核心功能直击教师痛点

随着在线教育的普及,一款稳定、高效、易用的教学工具已成为广大教师的普遍需求。近期,一款名为「魔果云课」的软件因其聚焦核心教学场景的设计,受到了不少教育工作者的关注。本文将从实际应用角度,梳理其如何针对线上教学关键环节…

作者头像 李华
网站建设 2026/5/1 6:53:36

从卡顿到秒级响应,农业传感器PHP数据写入优化全解析

第一章:从卡顿到秒级响应,农业传感器PHP数据写入优化全解析在现代农业物联网系统中,成百上千的传感器实时采集温湿度、土壤pH值、光照强度等关键数据,这些数据通常通过HTTP接口由PHP后端接收并写入数据库。然而,原始实…

作者头像 李华
网站建设 2026/5/1 6:53:05

R量子计算模拟实战(qubit初始化完全指南)

第一章:R量子计算模拟实战概述在现代计算科学中,量子计算因其强大的并行处理能力而备受关注。尽管目前通用量子计算机尚未普及,但利用经典计算平台模拟量子系统已成为研究与教学的重要手段。R语言虽以统计分析见长,但其灵活的矩阵…

作者头像 李华