澄清CUDA中的内存事务

澄清CUDA中的内存事务,cuda,gpu,Cuda,Gpu,我对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 segment

我对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.
(一) 我对设备内存的理解是,线程对设备内存的访问是未缓存的:因此,如果线程访问内存位置
a[i]
,它将只获取
a[i]
,并且没有
a[i]
周围的值。因此,第一种说法似乎与此相矛盾。或者我误解了“内存事务”这个短语在这里的用法

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

  • 内存事务按每个扭曲执行。因此,32字节事务是8位类型的扭曲大小读取,64字节事务是16位类型的扭曲大小读取,128字节事务是32位类型的扭曲大小读取
  • 这只是意味着所有读取必须与自然字长边界对齐。扭曲不可能读取具有一个字节偏移量的128字节事务。有关更多详细信息,请参阅

  • 非常感谢。澄清一下,如果一个warp需要为一个128字节的事务读取128字节,那么128字节组的第一个字节应该是128的倍数,对吗?同样,对于32字节事务和64字节事务,您描述的要求对于实现最高性能是必要的,因为它使GPU能够使用单个内存事务为warp中的所有线程提供服务。但这并不是绝对的要求。扭曲中的每个线程都可以从任何地址读取,只要地址正确对齐。GPU将根据需要自动安排尽可能多的事务。这就是所谓的“分散读/写”。换句话说,“如果一个扭曲需要为一个128字节的事务读取128字节,128字节组的第一个字节应该是128的倍数”,这句话是正确的,但重点是“应该”。这是获得最佳性能所必需的。从扭曲中读取128字节意味着每个线程读取4字节。在这种情况下,每个线程都可以从内存中任何4字节对齐的地址读取数据,尽管最终可能会有32个单独的事务。@罗杰·达尔,这意味着,如果warp的每个线程都需要从彼此“很远”的地址读取数据,那么GPU将发出32个内存事务(warp的每个线程一个)不是单个内存事务,对吗?@Talonmes我还有一个后续问题。在同一节5.3.2.1.1(讨论大小和对齐要求)中,它说“全局内存指令支持读取和写入大小等于1、2、4、8或16字节的字”。这似乎是对我问题的第一个陈述的概括,包括每个扭曲的32*8=256和32*16=512字节内存事务。这是正确的吗?这是编程指南的链接