【问题标题】:Clarifying memory transactions in CUDA澄清 CUDA 中的内存事务
【发布时间】:2012-08-11 04:03:14
【问题描述】:

我对 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],并且没有 a[i] 附近的值。所以第一个陈述似乎与此相矛盾。或者我在这里误解了“内存事务”这个短语的用法?

2) 第二句好像不是很清楚。有人可以解释一下吗?

【问题讨论】:

    标签: cuda gpu


    【解决方案1】:
    1. 内存事务按warp执行。所以 32 字节事务是 8 位类型的 warp 大小读取,64 字节事务是 16 位类型的 warp 大小读取,128 字节事务是 32 位类型的 warp 大小读取。
    2. 这只是意味着所有读取都必须与自然字长边界对齐。 warp 不可能读取具有 1 字节偏移量的 128 字节事务。有关详细信息,请参阅this answer

    【讨论】:

    • 谢谢。澄清一下,如果一个 warp 需要为一个 128 字节的事务读取 128 个字节,那么 128 字节组的第一个字节应该是 128 的倍数,对吧?同样对于 32 字节事务和 64 字节事务?
    • 您描述的要求对于最大性能是必要的,因为它使 GPU 可以通过单个内存事务为 warp 中的所有线程提供服务。但这不是绝对的要求。 Warp 中的每个线程 可以从任何地址读取,只要地址正确对齐即可。 GPU 将根据需要自动安排尽可能多的事务。这就是所谓的“分散读/写”。
    • 换句话说,“如果一个warp需要为一个128字节的事务读取128字节,那么128字节组的第一个字节应该是128的倍数”的说法是正确的,但是强调“应该”。它是最佳性能所必需的。从 warp 读取 128 字节意味着每个线程读取 4 个字节。在这种情况下,每个线程可以从内存中任何 4 字节对齐的地址读取,尽管您最终可能会得到 32 个单独的事务。
    • @Roger Dahl 这意味着,如果 warp 的每个线程需要从彼此“远离”的地址读取数据,GPU 将发出 32 个内存事务(每个线程一个经线)而不是单个内存事务,对吗?
    • @talonmies 我还有一个后续问题。在同一节 5.3.2.1.1 讨论 大小和对齐要求,它说“全局内存指令支持读取和写入大小等于 1,2,4,8 的字或 16 个字节”这似乎是通过为每个扭曲包含 32*8=256 和 32*16=512 字节的内存事务来概括我的问题的第一个陈述。这个对吗?这是编程指南的链接developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2012-07-10
    • 2011-06-27
    • 1970-01-01
    • 2016-02-21
    • 2016-07-14
    相关资源
    最近更新 更多