澄清CUDA中的内存事务
我对CUDA编程指南4.0第5.3.2.1节中的以下陈述感到困惑 在绩效指南一章中澄清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
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) 第二句话似乎不太清楚。有人能解释一下吗
非常感谢。澄清一下,如果一个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字节内存事务。这是正确的吗?这是编程指南的链接