邹城网站建设多少钱,免费的黄页渠道,域名跳转网站,开网店需要什么流程本地数据共享#xff08;LDS#xff09;是一种极低延迟、用于临时数据的RAM暂存器#xff0c;其有效带宽至少比直接、无缓存的全局内存高出一个数量级。它允许工作组内的工作项之间共享数据#xff0c;并用于保存像素着色器参数插值所需的参数。与只读缓存不同#xff0c;…本地数据共享LDS是一种极低延迟、用于临时数据的RAM暂存器其有效带宽至少比直接、无缓存的全局内存高出一个数量级。它允许工作组内的工作项之间共享数据并用于保存像素着色器参数插值所需的参数。与只读缓存不同LDS允许对内存空间进行高速的写入后读取复用聚集/读取/加载和分散/写入/存储操作。10.1 概述下图展示了LDS集成到AMD GPU内存使用OpenCL的概念框架。图6高级内存配置LDS物理上位于芯片上紧邻算术逻辑单元ALU其速度大约比全局内存快一个数量级假设没有存储体冲突。每个计算单元拥有64 kB内存分为32个库每库512个双字。每个存储体是一个256x32的双端口RAM每个时钟周期可1读1写。双字按顺序放入各个存储体但所有存储体可以同时执行存储或加载操作。一个工作组最多可以请求64 kB内存。跨波前的读取操作以瀑布式分四个周期调度。LDS内存的高带宽不仅得益于其靠近ALU还因为能同时访问其多个存储体。因此有可能并发执行32条写入或读取指令每条指令名义上为32位扩展指令如read2/write2每条可为64位。然而如果同一时间对同一存储体进行多次访问尝试就会发生存储体冲突。在这种情况下对于索引和原子操作硬件会将这些对同一存储体的并发访问尝试转为串行访问以防止冲突。这会降低LDS的有效带宽。因此为了获得最大吞吐量最佳效率避免存储体冲突至关重要。了解请求调度和地址映射是实现这一目标的关键。10.2 内存层次结构中的数据流下图是内存结构内数据流的概念图。要将数据从全局内存加载到LDS需要从全局内存读取数据并放入工作项的寄存器然后执行一次到LDS的存储操作。类似地要将数据存储到全局内存需要从LDS读取数据放入工作项寄存器然后再放入全局内存。为了有效利用LDS算法必须在全局内存和LDS之间传输的数据上执行多次操作。也可以绕过VGPR直接从内存缓冲区将数据加载到LDS。LDS原子操作在LDS硬件中执行。因此尽管这些操作不直接使用ALU但执行此功能会带来LDS延迟。10.3 LDS访问LDS通过以下三种方式之一进行访问直接读取参数读取索引或原子操作以下小节描述了这些方法。10.3.1 LDS直接读取直接读取仅在LDS中可用GDS中不可用。LDS直接读取发生在向量ALUVALU指令中允许LDS提供一个双字值该值广播到波前中的所有线程并用作ALU操作的SRC0输入。VALU指令通过在SRC0字段使用LDS_DIRECT来指示输入由LDS提供。要从LDS读取的数据的LDS地址和数据类型来自M0寄存器LDS_addr M0[15:0] (byte address and must be Dword aligned) DataType M0[18:16] 0 unsigned byte 1 unsigned short 2 Dword 3 unused 4 signed byte 5 signed short10.3.2 LDS参数读取参数读取仅在LDS中可用GDS中不可用。像素着色器使用LDS读取顶点参数值然后像素着色器对其进行插值以找到每个像素的参数值。当使用以下操作码时会发生LDS参数读取V_INTERP_P1_F32D P10 * S P0 参数插值第一步。V_INTERP_P2_F32D P20 * S D 参数插值第二步。V_INTERP_MOV_F32D {P10,P20,P0}[S] 参数加载。典型的参数插值操作涉及读取三个参数P0、P10和P20并使用两个重心坐标I和J来确定最终的每像素值Final value P0 P10 * I P20 * J参数插值指令指示参数属性编号0到32和分量编号0x, 1y, 2z, 3w。参数插值和参数移动指令在使用M0寄存器之前必须初始化它。lds_param_offset[15:0]是从分配给此波前的LDS存储空间起始处到该波前参数在LDS内存中开始位置的地址偏移量。new_prim_mask是一个15位掩码每个四边形对应一位该掩码中的1表示此四边形开始一个新的图元0表示它使用与前一四边形相同的图元。掩码是15位而非16位因为波前中的第一个四边形总是开始一个新图元因此不包含在掩码中。10.3.3 数据共享的索引和原子访问LDS和GDS都可以执行索引和原子数据共享操作。为简洁起见下文使用LDS除非特别说明否则也适用于GDS。索引和原子操作通过VGPR向LDS提供每个工作项的唯一地址并将每个工作项的唯一数据提供给VGPR或从VGPR返回。由于LDS内部的分库结构操作最快可在两个周期内完成最多可能需要64个周期具体取决于存储体冲突映射到同一内存存储体的地址的数量。索引操作是简单的LDS加载和存储操作从VGPR读取数据或将数据返回到VGPR。原子操作是算术操作将VGPR的数据与LDS中的数据结合并将结果写回LDS。原子操作可以选择将LDS的操作前值返回到VGPR。下表列出并简要描述了LDS指令字段。表44LDS指令字段所有LDS操作都需要在使用前初始化M0。M0包含一个大小值可用于将访问限制在分配的LDS范围的子集内。如果不需要限制则将M0设置为0xFFFFFFFF。表45LDS索引加载/存储单地址指令LDS_Addr LDS_BASE VGPR[ADDR] {InstrOffset1,InstrOffset0}双地址指令LDS_Addr0 LDS_BASE VGPR[ADDR] InstrOffset0*ADJ LDS_Addr1 LDS_BASE VGPR[ADDR] InstrOffset1*ADJ Where ADJ 4 for 8, 16 and 32-bit data types; and ADJ 8 for 64-bit.其中对于8、16和32位数据类型ADJ 4对于64位数据类型ADJ 8。注意LDS_ADDR1仅用于READ2、WRITE2和WREXCHG2*。M0[15:0]提供了此次访问的字节大小。发送到LDS的大小是MIN(M0, LDS_SIZE)其中LDS_SIZE是着色器处理器插值器SPI在波前创建时分配的LDS空间量。地址来自VGPRADDR和InstrOffset都是字节地址。在 wavefront 创建时LDS_BASE被分配给此波前或工作组拥有的物理LDS区域。通过将两个偏移量设置为相同的值来指定单个地址。这会导致只发生一次读取或写入并且仅使用第一个DATA0。SRC2操作ds_op_src2_type操作码是不同的。这些操作数对LDS内存中的两个操作数执行原子操作一个被视为数据另一个是第二个源操作数和最终目的地。这些操作的寻址可以根据offset1[7]的最高有效位MSB以两种不同的模式运行如果为0则数据项的偏移量由偏移字段作为有符号双字偏移量导出LDS_Addr0 LDS_BASE VGPR(ADDR) SIGNEXTEND(InstrOffset1[6:0],InstrOffset0))2 // data term LDS_Addr1 LDS_BASE VGPR(ADDR) // second source and final destination address如果该位为1则数据项的偏移量变为每个线程的偏移量并且是一个从VGPR为索引读取的MSB导出的有符号双字偏移量。寻址变为LDS_Addr0 LDS_BASE VGPR(ADDR)[16:0] SIGNEXTEND(VGPR(ADDR)[31:17])2 // data term LDS_Addr1 LDS_BASE VGPR(ADDR)[16:0] // second source and final destination addressLDS原子操作DS_atomicOp OP, GDS0, OFFSET0, OFFSET1, VDST, ADDR, Data0, Data1数据大小在atomicOp中编码字节、字、双字或双精度。LDS_Addr0 LDS_BASE VGPR[ADDR] {InstrOffset1,InstrOffset0}ADDR是一个双字地址。对于双精度数据VGPR 0、1和dst是双GPR。VGPR数据源只能是VGPR或常数值不能是SGPR。