2026/1/9 10:05:52
网站建设
项目流程
北京东城网站建设,做蓝牙app的网站,cad图纸免费下载网站,搜索推广标量内存读#xff08;SMEM#xff09;指令允许着色器程序通过标量数据缓存将数据从内存加载到SGPR中#xff0c;或将数据从SGPR通过标量数据缓存写入内存。指令一次可以读取1到16个双字#xff08;Dword#xff09;#xff0c;或写入1到4个双字。数据直接读入SGPR#…标量内存读SMEM指令允许着色器程序通过标量数据缓存将数据从内存加载到SGPR中或将数据从SGPR通过标量数据缓存写入内存。指令一次可以读取1到16个双字Dword或写入1到4个双字。数据直接读入SGPR无需任何格式转换。标量单元在内存和SGPR之间读写连续的双字。这主要用于加载ALU常量和间接T#/S#查找。不支持数据格式转换也不支持字节或短数据。7.1 微码编码标量内存读、写和原子指令使用SMEM微码格式进行编码。字段描述如下表所示表24. SMEM编码字段描述字段大小描述OP8操作码IMM1确定如何解释OFFSET字段。IMM1偏移量是地址的20位无符号字节偏移量。IMM0OFFSET[6:0]指定提供无符号字节偏移量的SGPR或M0对于存储必须是M0。STORE和ATOMIC指令不能使用SGPR只能使用立即数或M0。GLC1全局一致性。对于加载控制L1缓存策略0hit_lru1miss_evict。对于存储控制L1缓存旁路0写合并1写直达。对于原子操作1表示原子操作返回操作前的值。SDATA7要返回读取数据的SGPR或要从中获取写入数据的SGPR。读取两个双字时SDST-sgpr必须是偶数。读取四个或更多双字时DST-gpr必须对齐到4的倍数。SDATA必须是SGPR或VCC。不能是exec或m0。SBASE6SGPR对SBASE的隐含LSB为零提供基地址或对于BUFFER指令提供包含资源常量的4个SGPR4-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_DISCARDADDR SGPR[base] inst_offset { M0或SGPR[offset]或零 }S_SCRATCH_LOAD / S_SCRATCH_STOREADDR SGPR[base] inst_offset { M0或SGPR[offset]或零 } * 64偏移字段的使用IMMSOFFSET_EN (SOE)地址00SGPR[base] (SGPR[offset]或M0)01SGPR[base] (SGPR[soffset]或M0)10SGPR[base] inst_offset11SGPR[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个双字则返回到SDST1、SDST2等偏移量每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位时钟计数器到一对SGPRSDST和SDST1。7.2.5 S_MEMREALTIME此指令读取64位实时计数器并将值返回到一对SGPRSDST和SDST1。时间值来自频率恒定的时钟不受电源模式或核心时钟频率变化的影响。7.3 依赖性检查标量内存读和写可以以不同于发出顺序的顺序返回数据当读取跨越两个缓存行时它们可以在不同时间返回部分结果。着色器程序使用LGKM_CNT计数器来确定数据何时已返回到SDST SGPR。具体操作如下每个单双字的获取LGKM_CNT递增1每个两个或更多双字的获取LGKM_CNT递增2每个指令完成时LGKM_CNT递减相同数量由于指令可以乱序返回使用此计数器的唯一合理方式是实现S_WAITCNT 0这会在继续之前等待所有数据从先前的SMEM返回。7.4 对齐和边界检查SDST对于两个双字的获取包括S_MEMTIMESDST的值必须是偶数对于更大的获取必须是4的倍数。如果不遵循此规则可能导致无效数据。如果SDST超出范围则不执行指令。SBASE对于S_BUFFER_LOADSBASE的值必须是偶数指定SGPR的地址是4的倍数。如果SBASE超出范围则使用SGPR0的值。OFFSETOFFSET的值没有对齐限制。内存地址如果内存地址超出范围被钳位则对于任何超出范围的双字不执行操作。