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

Han*_*Han 0 cuda bank-conflict

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

有一些要点:

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

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

提前致谢!

Rob*_*lla 5

  1. "半翘曲"的主要用法在Fermi生成之前应用于CUDA处理器(例如"特斯拉"或GT200代,以及原始的G80/G92代). 这些GPU采用SM(流式多处理器 - GPU内部的硬件模块)构建,其中少于32个线程处理器.warp的定义仍然相同,但实际的HW执行一次发生在"半warp"中.实际上,粒度细节比这更复杂,但足以说执行模型导致根据半warp的需要发出内存请求,即warp中的16个线程.因此,针对内存事务的完整warp将为该事务生成总共2个请求.

    Fermi和更新的GPU每个SM至少有32个线程处理器.因此,在整个warp中立即可以看到内存事务.结果,内存请求以每个warp级别发出,而不是每半个warp.但是,完整内存请求一次只能检索128个字节.因此,对于每个事务每个线程大于32位的数据大小,存储器控制器仍然可以将请求分解为半经线大小.

    我的观点是,特别是初学者,没有必要详细了解半翘曲.通常,理解它指的是一组16个线程一起执行并且它对内存请求有影响.

  2. 例如,费米级GPU上的共享存储器 被分成32个存储体.在以前的GPU上, 它被分为16个银行.每次在同一存储器请求中由多个线程访问单个存储体时(即源自相同的代码指令),就会发生存储体冲突.为避免银行冲突,基本策略与合并内存请求的策略非常相似,例如.为全球记忆.在Fermi和更新的GPU上,多个线程可以读取相同的地址而不会导致存储体冲突,但通常银行冲突的定义是当多个线程从同一个存储体读取时.为了进一步了解共享内存以及如何避免银行冲突,我建议您参加有关此主题NVIDIA网络研讨会.