我已经了解了合并内存访问(In CUDA, what is memory coalescing, and how is it achieved?)及其性能重要性。但是,当发生非合并内存访问时,我不知道典型的GPU会做什么。当一个帖子"问"对于位置P中的一个字节而其他线程要求远处的东西,GPU为该线程获取一个128字节的完整块?如果读数是对齐的,我可以读取" free"?
的其他127个字节答案 0 :(得分:2)
一般规则:
如果单个线程生成的地址不在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差异的一般细分如下:
int
或float
),因此最终仍然需要四个 L2缓存行。 (没有免费的午餐。)This presentation将具有指导意义。特别是,幻灯片17显示了#34;完美"的一个例子。合并,而幻灯片25显示了一个"完全未聚合的"负荷。