【问题标题】:Why are CUDA memory allocations aligned to 256 bytes?为什么 CUDA 内存分配与 256 字节对齐?
【发布时间】:2021-02-28 19:26:48
【问题描述】:

根据cuda alignment 256bytes seriously? CUDA 内存分配保证至少与 256 字节对齐。

为什么会这样? 256 字节比任何数字数据类型都要大得多。它可能是向量的大小,但 GPU 不需要加载/存储与整个向量的大小对齐,实际上它们甚至支持收集/分散,其中每个单独的元素都可以放置在任何内存地址这是元素大小的倍数。

256 字节对齐有什么用途?

【问题讨论】:

  • 如您链接的问题中所示,CUDA 设备具有纹理对齐要求(还有表面对齐要求等)。当我在 T4 上运行 deviceQuery 时,它报告了 512 字节的纹理对齐要求。因此,提供这种分配粒度的一个原因是为了支持这些需求。如果您问“纹理系统需要对齐 512 字节是什么?”我将无法回答。然而,纹理有时具有空间缓存行为,并且空间缓存可能比单一类型对齐更高。

标签: cuda gpu gpgpu memory-alignment


【解决方案1】:

为什么会这样? 256 字节比任何数字数据类型都大。

好吧,我敢肯定有多种原因(例如,管理更少、更大的分配更容易),但关于您的具体观点:不要考虑数字的 单个 值数据类型——考虑一个完整的warp值:如果sizeof(float)是4,那么floats的warp值是32 * 4 = 128字节。如果它是doublelong int(64 位整数),那么你会得到32 * 8 = 256

注意:warp 没有必要从内存中合并读取多个值。单个线程可以读取单个未对齐的字节,这将起作用。但是 - 如果读取模式没有合并到读取连续、对齐的块(通常为 128 字节或 32 字节),性能将会受到影响;另见:

In CUDA, what is memory coalescing, and how is it achieved?

【讨论】:

  • 是的,但这不像是一个warp需要存储在一个与整个warp的大小对齐的地址,是吗?我以为对齐要求只是单个元素的大小?
  • 不,这不是必需的,但是非常鼓励这样做,如果从不是 128 字节对齐(或 32 字节对齐,这取决于情况)。有效读取的对齐要求确实是元素的大小,但没有人说这会很快:-( ...另外 - 为什么这会打扰你?记住,你不应该进行大量分配无论如何。它们既慢又昂贵。
  • 啊哈!我没有意识到这一点。它只是困扰我,因为我不明白发生了什么,所以它没有意义。好的,谢谢!
猜你喜欢
  • 2012-12-14
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多