CUDA中经线和银行的机制是什么?

时间:2013-02-16 10:23:44

标签: cuda bank-conflict

我是学习CUDA并行编程的新手。现在我对设备的全局内存访问感到困惑。这是关于扭曲模型和合并的。

有一些观点:

  1. 据说一个块中的线程被分成了warp。在每个warp中最多有32个线程。这意味着同一warp的所有这些线程将与同一处理器同时执行。那么半翘曲的感觉是什么?

  2. 当涉及到一个块的共享内存时,它将被分成16个库。为了避免银行冲突,多个线程可以同时读取一个银行而不是写入同一个银行。这是正确的解释吗?

  3. 提前致谢!

1 个答案:

答案 0 :(得分:5)

  1. “半翘曲”的主要用法适用于CUDA处理器 在费米一代之前(例如“特斯拉”或GT200代, 和原来的G80 / G92一代)。 These GPUs were architected with a SM (streaming multiprocessor -- a HW block inside the GPU) that had fewer than 32 thread processors。 warp的定义仍然相同,但实际的HW 执行一次发生在“半翘曲”中。实际上是 粒度细节比这更复杂,但足够了 说执行模型导致发出内存请求 根据半经线的需要,即经线内的16个线程。 因此,完成内存事务的完整warp会产生一个 该交易共有2个请求。

    Fermi and newer GPUs have at least 32 thread processors per SM。 因此,内存事务在整个过程中立即可见 经。结果,内存请求以每个warp发出 等级,而不是每半经线。但是,一个完整的内存请求 一次只能检索128个字节。因此,对于数据大小 每个事务每个线程大于32位的内存 控制器仍然可以将请求分解为半经线大小。

    我的观点是,特别是初学者,没有必要 对半翘有详细的了解。一般来说 足以理解它指的是一组16个线程 一起执行,它对内存请求有影响。

  2. 共享内存,例如Fermi-class GPUs 分为32家银行。在previous GPUs 它被分成了16家银行。银行冲突随时发生 个人银行由同一个多个线程访问 存储器请求(即源自相同的代码指令)。 为了避免银行冲突,基本策略非常类似于 合并内存请求的策略,例如。为全球记忆。在Fermi和更新的GPU上,多个线程可以读取相同的地址而不会导致存储体冲突,但通常银行冲突的定义是从多个线程读取的多个线程银行。为了进一步了解共享内存以及如何避免银行冲突,我建议NVIDIA webinar上的this topic