news 2026/2/24 7:35:04

07章 标量内存操作 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
07章 标量内存操作 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

标量内存读(SMEM)指令允许着色器程序通过标量数据缓存将数据从内存加载到SGPR中,或将数据从SGPR通过标量数据缓存写入内存。指令一次可以读取1到16个双字(Dword),或写入1到4个双字。数据直接读入SGPR,无需任何格式转换。

标量单元在内存和SGPR之间读写连续的双字。这主要用于加载ALU常量和间接T#/S#查找。不支持数据格式转换,也不支持字节或短数据。

7.1 微码编码

标量内存读、写和原子指令使用SMEM微码格式进行编码。

字段描述如下表所示:

表24. SMEM编码字段描述

字段大小描述
OP8操作码
IMM1确定如何解释OFFSET字段。
IMM=1:偏移量是地址的20位无符号字节偏移量。
IMM=0:OFFSET[6:0]指定提供无符号字节偏移量的SGPR或M0(对于存储,必须是M0)。STORE和ATOMIC指令不能使用SGPR:只能使用立即数或M0。
GLC1全局一致性。
对于加载:控制L1缓存策略:0=hit_lru,1=miss_evict。
对于存储:控制L1缓存旁路:0=写合并,1=写直达。对于原子操作,"1"表示原子操作返回操作前的值。
SDATA7要返回读取数据的SGPR,或要从中获取写入数据的SGPR。
读取两个双字时,SDST-sgpr必须是偶数。
读取四个或更多双字时,DST-gpr必须对齐到4的倍数。SDATA必须是:SGPR或VCC。不能是:exec或m0。
SBASE6SGPR对(SBASE的隐含LSB为零),提供基地址,或对于BUFFER指令,提供包含资源常量的4个SGPR(4-sgpr对齐)。对于BUFFER指令,仅使用的资源字段是:base、stride、num_records。
OFFSET20无符号字节偏移量,或保存偏移量的SGPR地址。写入和原子操作:只能是M0或立即数,不能是SGPR。
NV1非易失性。
SOE1标量偏移启用。

7.2 操作

7.2.1 S_LOAD_DWORD, S_STORE_DWORD

这些指令在SGPR和内存之间加载1-16个双字或存储1-4个双字。SGPR中的数据在SDATA中指定,地址由SBASE、OFFSET和SOFFSET字段组成。

标量内存寻址

S_LOAD / S_STORE / S_DCACHE_DISCARD:

ADDR = SGPR[base] + inst_offset + { M0或SGPR[offset]或零 }

S_SCRATCH_LOAD / S_SCRATCH_STORE:

ADDR = SGPR[base] + inst_offset + { M0或SGPR[offset]或零 } * 64

偏移字段的使用:

IMMSOFFSET_EN (SOE)地址
00SGPR[base] + (SGPR[offset]或M0)
01SGPR[base] + (SGPR[soffset]或M0)
10SGPR[base] + inst_offset
11SGPR[base] + inst_offset + (SGPR[soffset]或M0)

地址的所有组件(base、offset、inst_offset、M0)都以字节为单位,但最低两位被忽略并被视为零。S_DCACHE_DISCARD忽略最低六位,使地址64字节对齐。

如果inst_offset为负数且结果(inst_offset + (M0或SGPR[offset]))为负数,则是非法且未定义的。

对私有空间的标量访问必须使用缓冲区常量或手动转换地址:

Addr = Addr - private_base + private_base_addr + scratch_baseOffset_for_this_wave

"隐藏的私有基地址"对硬件不可用:必须预先加载到SGPR中或通过常量缓冲区可用。这相当于驱动程序为缓冲区常量从头计算基地址所必须做的操作。

标量指令不能覆盖自己的源寄存器,因为指令可能由于ATC XNACK而重放。类似地,标量内存子句中的指令不能覆盖子句中任何指令的源寄存器。子句定义为同一类型的内存指令字符串。任何非内存指令都会中断子句。

原子操作是另一种情况,因为它们自然对齐,并且必须在单指令子句中。根据定义,返回操作前值的原子操作会覆盖其数据源,这是可以接受的。

使用缓冲区常量的读/写/原子操作

使用的缓冲区常量字段:base_address、stride、num_records、NV。其他字段被忽略。

标量内存读/写不支持"swizzled"缓冲区。stride仅用于内存地址边界检查,不用于计算访问地址。

SMEM仅提供SBASE地址(字节)和偏移量(字节或双字)。任何"索引 * stride"必须在着色器代码中手动计算,并在SMEM之前添加到偏移量中。

V#.base和最终地址的最低两位被忽略以强制双字对齐。

"m_*" 组件来自缓冲区常量(V#):

offset = IMM ? OFFSET : SGPR[OFFSET] m_base = { SGPR[SBASE * 2 +1][15:0], SGPR[SBASE] } m_stride = SGPR[SBASE * 2 +1][31:16] m_num_records = SGPR[SBASE * 2 + 2] m_size = (m_stride == 0) ? 1 : m_num_records m_addr = (SGPR[SBASE * 2] + offset) & ~0x3 SGPR[SDST] = read_Dword_from_dcache(m_base, offset, m_size)

如果要读取多于1个双字,则返回到SDST+1、SDST+2等,偏移量每DWORD增加4字节。

7.2.2 标量原子操作

标量内存单元支持与向量内存单元相同的内存原子操作集。寻址方式与标量内存加载和存储相同。与向量内存原子操作类似,标量原子操作可以将"操作前值"返回到SDATA SGPR。通过将微码GLC位设置为1来启用此功能。

7.2.3 S_DCACHE_INV, S_DCACHE_WB

此指令使整个数据缓存无效,或对脏数据执行"写回"。不向SDST返回任何内容。

7.2.4 S_MEMTIME

此指令读取64位时钟计数器到一对SGPR:SDST和SDST+1。

7.2.5 S_MEMREALTIME

此指令读取64位"实时计数器",并将值返回到一对SGPR:SDST和SDST+1。时间值来自频率恒定的时钟(不受电源模式或核心时钟频率变化的影响)。

7.3 依赖性检查

标量内存读和写可以以不同于发出顺序的顺序返回数据;当读取跨越两个缓存行时,它们可以在不同时间返回部分结果。着色器程序使用LGKM_CNT计数器来确定数据何时已返回到SDST SGPR。具体操作如下:

  • 每个单双字的获取,LGKM_CNT递增1

  • 每个两个或更多双字的获取,LGKM_CNT递增2

  • 每个指令完成时,LGKM_CNT递减相同数量

由于指令可以乱序返回,使用此计数器的唯一合理方式是实现S_WAITCNT 0;这会在继续之前等待所有数据从先前的SMEM返回。

7.4 对齐和边界检查

SDST
对于两个双字的获取(包括S_MEMTIME),SDST的值必须是偶数;对于更大的获取,必须是4的倍数。如果不遵循此规则,可能导致无效数据。如果SDST超出范围,则不执行指令。

SBASE
对于S_BUFFER_LOAD,SBASE的值必须是偶数(指定SGPR的地址是4的倍数)。如果SBASE超出范围,则使用SGPR0的值。

OFFSET
OFFSET的值没有对齐限制。

内存地址:如果内存地址超出范围(被钳位),则对于任何超出范围的双字不执行操作。

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

深度学习常用数据集的分类解析

本文主要探讨深度学习常用数据集,涵盖图像、文本、语音、推荐等多个领域的关键数据集: 一、计算机视觉数据集 1. 经典图像分类 MNIST​ 手写数字(0-9),6万训练+1万测试 入门基准,常用于算法验证 CIFAR-10/100​ 10类(CIFAR-10)或100类(CIFAR-100)物体图片 32x32小…

作者头像 李华
网站建设 2026/2/21 13:48:03

如何快速掌握Gittyup:5个实用技巧让Git管理更简单

如何快速掌握Gittyup:5个实用技巧让Git管理更简单 【免费下载链接】Gittyup Understand your Git history! 项目地址: https://gitcode.com/gh_mirrors/gi/Gittyup Gittyup是一款功能强大的开源图形化Git客户端,它能帮助你更直观地理解和操作Git版…

作者头像 李华
网站建设 2026/2/22 12:45:50

SageAttention终极指南:3倍加速注意力机制的革命性突破

SageAttention终极指南:3倍加速注意力机制的革命性突破 【免费下载链接】SageAttention Quantized Attention that achieves speedups of 2.1-3.1x and 2.7-5.1x compared to FlashAttention2 and xformers, respectively, without lossing end-to-end metrics acro…

作者头像 李华
网站建设 2026/2/21 20:39:45

手把手教你用DIG:从零开始玩转图神经网络实验 [特殊字符]

手把手教你用DIG:从零开始玩转图神经网络实验 🚀 【免费下载链接】DIG A library for graph deep learning research 项目地址: https://gitcode.com/gh_mirrors/dig/DIG DIG是一个专为图深度学习研究设计的开源工具库,提供了丰富的图…

作者头像 李华
网站建设 2026/2/8 3:41:34

适合集成到交互系统的AI视频模型:Wan2.2-T2V-5B推荐

适合集成到交互系统的AI视频模型:Wan2.2-T2V-5B推荐 你有没有遇到过这种情况:产品团队急着上线一个互动功能,比如“输入一句话,生成一段小动画”,结果一查技术方案——得,光是跑个文本生成视频的模型就得配…

作者头像 李华
网站建设 2026/2/22 2:11:43

Vue网络图组件实战:解决复杂数据可视化的5个关键问题

Vue网络图组件实战:解决复杂数据可视化的5个关键问题 【免费下载链接】v-network-graph An interactive network graph visualization component for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vn/v-network-graph 在当今数据驱动的时代,如…

作者头像 李华