在CUDA中澄清内存事务

6
我对CUDA编程指南4.0的性能指南章节5.3.2.1中的以下陈述感到困惑。
Global memory resides in device memory and device memory is accessed
via 32-, 64-, or 128-byte memory transactions. 

These memory transactions must be naturally aligned:Only the 32-, 64- , 
128- byte segments of device memory 
that are aligned to their size (i.e. whose first address is a 
multiple of their size) can be read or written by memory 
transactions.

1) 我对设备内存的理解是,线程对设备内存的访问是未缓存的:因此,如果线程访问内存位置 a[i],它只会获取 a[i] 而不是周围的任何值。因此,第一句话似乎与此相矛盾。或者我没有正确理解这里“内存事务”的用法?

2) 第二句话似乎不太清晰。有人能解释一下吗?

1个回答

7
  1. 内存交易是针对每个warp执行的。因此,32字节事务是对8位类型进行的warp尺寸读取,64字节事务是对16位类型进行的warp尺寸读取,而128字节事务则是对32位类型进行的warp尺寸读取。
  2. 这意味着所有读取必须对齐到自然的字大小边界。一个warp无法以一个字节偏移读取128字节的事务。有关更多细节,请参见此答案

谢谢。只是为了澄清,如果一个warp需要读取128字节的128字节事务,那么128字节组的第一个字节应该是128的倍数,对吗?同样适用于32字节事务和64字节事务? - smilingbuddha
1
您所描述的要求对于最大性能是必要的,因为它使GPU能够通过单个内存事务为warp中的所有线程提供服务。但这不是绝对要求。只要地址正确对齐,warp中的每个线程都可以从任何地址读取。GPU将自动安排所需的所有事务。这就是所谓的“分散读/写”。 - Roger Dahl
1
换句话说,“如果一个warp需要读取128字节进行128字节的事务处理,那么128字节组的第一个字节应该是128的倍数”这个语句是正确的,但要强调“应该”。这是为了获得最佳性能所必需的。从warp中读取128字节意味着每个线程读取4个字节。在这种情况下,每个线程可以从内存中的任何4字节对齐地址读取,尽管您可能会得到32个单独的事务。 - Roger Dahl
@Roger Dahl 这意味着,如果warp中的每个线程需要从“远离”彼此的地址读取数据,则GPU将发出32个内存事务(每个warp线程一个),而不是单个内存事务,对吗? - smilingbuddha
@talonmies 我还有一个后续问题。在同一节5.3.2.1.1中,它谈到了大小和对齐要求,它说:“全局内存指令支持读写大小为1、2、4、8或16字节的单词”。这似乎是通过将每个warp的32 * 8 = 256字节和32 * 16 = 512字节的内存事务纳入总体情况来概括我的问题的第一个陈述。这正确吗?这是编程指南的链接http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf - smilingbuddha
@smilingbuddha:注意“指令”这个词。8字节和16字节的加载/存储指令会生成多个128字节每个warp的硬件事务,以便服务请求。 - talonmies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接