gpu compute 1.3中合并和未合并内存事务的数量

时间:2012-03-18 12:04:22

标签: cuda opencl gpu gpgpu

cuda profiler手册指出,由于更加宽松的合并策略,未合并的内存事务的数量将始终为零。但我确信仍然存在不合并的情况。怎么计算呢?是否有任何工具或模拟器可以帮助?其中,哪一个似乎最准确? 感谢

1 个答案:

答案 0 :(得分:11)

在设备1.0中,您只有两个选项:

  • 内存访问已合并,所有数据都在一次内存事务中获取
  • 内存访问是未分离的,数据是逐个获取的 - 因此,总是有16个内存事务(半翘曲)。

在设备1.2和1.3中,这是以不同的方式完成的。 想象一下,您的设备内存分为每个128字节的块。您需要的内存事务数与您命中的块数一样多。所以:

  • 如果您获得了完美的合并访问权限,则会获得1次内存交易
  • 如果你只是错位,你可能会得到2次记忆交易
  • 如果每个线程都访问每个第n个字,则可以获得3个,4个甚至更多的内存事务
  • 在最坏的情况下,您可以获得16次内存交易
  • 但即使访问有点随机,但本地化,两个线程可能碰巧落入同一个块,您将需要少于16个内存事务

有很多情况,所以将其分为两类:合并/未合并已经没有任何意义了。这就是为什么,Cuda Profiler采用了不同的方式。它们只计算内存事务的数量。您的访问模式越随机,内存事务计数就越高,即使您拥有相同的内存访问指令数。

以上是略微简化的模型。实际上,内存事务可以访问128字节,64字节或32字节宽的块 - 以节省带宽。在列表浏览器中查找列加载128b,加载64b,加载32b,并存储128b,存储64b,存储32b。