cuda记忆合并

时间:2013-02-10 00:40:57

标签: memory-management cuda coalescing

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

第二个问题:如果内存读取无法合并,每个线程只读取4个字节(是吗?)所有线程的内存访问是否会顺序进行?

1 个答案:

答案 0 :(得分:1)

这取决于您正在使用的架构。但是,在费米和开普勒你有:

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

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