合并的内存访问性能

时间:2014-11-10 00:04:45

标签: opengl cuda gpu gpgpu

我已经了解了合并内存访问(In CUDA, what is memory coalescing, and how is it achieved?)及其性能重要性。但是,当发生非合并内存访问时,我不知道典型的GPU会做什么。当一个帖子"问"对于位置P中的一个字节而其他线程要求远处的东西,GPU为该线程获取一个128字节的完整块?如果读数是对齐的,我可以读取" free"?

的其他127个字节

1 个答案:

答案 0 :(得分:2)

一般规则:

  • 内存访问指令在warp范围内发布,就像任何其他指令一样
  • warp中的每个线程都提供了一个从
  • 读取的地址
  • 假设这些地址不会被击中"在任何高速缓存中,存储器控制器收集所有地址并确定有多少"段" DRAM需要(大致类似于高速缓存行)。 A"段"取决于缓存和设备细节,可以是32字节或128字节。
  • 然后内存控制器从DRAM
  • 请求那些行/段

如果单个线程生成的地址不在warp中生成的任何其他地址附近,那么内存控制器将需要从DRAM请求整行/段,可以是32字节或128字节,取决于设备和涉及哪些缓存(即,发生了什么类型的"未命中" )只是为了满足来自该一个线程的那个地址。因此,无论该线程在单个线程读取事务中是否请求最少1个字节或最多16个字节,内存控制器必须从DRAM读取32个字节或128个字节以满足源自该线程的读取。类似的逻辑将适用于源自该特定" warp read"的所有其他地址。

这种分散或隔离的访问模式是" uncoalesced",因为warp中没有其他线程需要足够接近的地址,以便它可以从同一段/行中满足其需求。

  

当一个帖子"问"对于位置P中的一个字节而其他线程要求远处的东西,GPU为该线程获取一个128字节的完整块?

是的,32字节或128字节是可以从DRAM发出的最小请求粒度。

  

如果读数是对齐的,我可以读取其他127个字节的" free"?

无论您是否需要,无论行/段内的请求是否一致,您任何DRAM读取事务获得 32字节或128字节

这并不涵盖所有情况,但32byte / 128byte差异的一般细分如下:

  1. cc2.x设备具有启用的L1缓存,因此缓存" miss"通常会触发128字节的读取
  2. cc3.x设备仅启用了L2缓存(用于全局内存事务),L2缓存行大小为32字节。 A" miss"这将需要来自DRAM的32字节负载,但是在整个warp中完全合并读取仍将最终需要128字节的负载(例如,对于intfloat),因此最终仍然需要四个 L2缓存行。 (没有免费的午餐。)
  3. cc5.x设备再次启用了L1,因此应该回到需要一个完整的128字节加载" miss"
  4. This presentation将具有指导意义。特别是,幻灯片17显示了#34;完美"的一个例子。合并,而幻灯片25显示了一个"完全未聚合的"负荷。