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

Zk1*_*001 4 cuda gpu gpgpu opencl

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

Cyg*_*sX1 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.