【问题标题】:cuda memory coalescingcuda 内存合并
【发布时间】:2013-01-25 10:41:33
【问题描述】:

我想首先确认以下几点: 到共享内存的基本全局内存事务是 32 字节、64 或 128 字节,但前提是内存访问可以合并。先前交易的延迟都是相等的。对吗?

第二个问题:如果内存读取不能合并,每个线程只读取4个字节(是吗?)所有线程的内存访问都是顺序的吗?

【问题讨论】:

  • 您可能希望查看一些可用的网络研讨会here。特别是有一些网络研讨会涵盖了内存高效操作和global memory(和video)和shared memory (video) 的合并。内存事务以 32 或 128 字节粒度的大小发生。

标签: memory-management cuda coalescing


【解决方案1】:

这取决于您正在处理的架构。然而,在费米和开普勒上,你有:

  • 内存事务总是 32 字节或 128 字节,称为段
  • 仅使用L2缓存时使用32字节段,L2+L1时使用128字节段。
  • 如果同一 warp 的两个线程落入同一段,则数据将在单个事务中传递
  • 另一方面,如果您获取的数据段中有没有线程请求的数据 - 无论如何都会被读取,并且您(可能)浪费带宽
  • 整个段都属于 L1 和 L2 缓存,当您的相邻 warp 需要相同的段时,可能会降低您的带宽压力
  • 与它们通常交付的线程数相比,L1 和 L2 相当小。这就是为什么你不应该期望一段数据在缓存中停留很长时间(与 CPU 编程相反)
  • 您可以禁用 L1 缓存,如果您在随机内存访问模式中过度获取,这可能会有所帮助。

如您所见,有几个变量决定了您的内存访问需要多长时间。一般的经验法则是:访问模式越密集 - 越好!步幅或错位现在不像过去那么昂贵,所以不要太担心这一点,除非你正在做一些后期优化。

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 2020-08-17
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多