CUDA中的warp和bank的机制是啥?

Posted

技术标签:

【中文标题】CUDA中的warp和bank的机制是啥?【英文标题】:What's the mechanism of the warps and the banks in CUDA?CUDA中的warp和bank的机制是什么? 【发布时间】:2013-02-01 06:52:17 【问题描述】:

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

有几点:

    据说一个块中的线程被分割成warp。在每个经纱中最多有 32 个线程。这意味着同一个warp的所有这些线程将在同一个处理器上同时执行。那么半曲折的意义是什么?

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

提前致谢!

【问题讨论】:

【参考方案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根线。 因此,命中内存事务的完整扭曲将生成 该交易总共有 2 个请求。

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

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

    共享内存,例如Fermi-class GPUs 分为32个银行。在previous GPUs 它被分成16家银行。银行冲突随时发生 同一银行中的多个线程访问单个银行 内存请求(即源自相同的代码指令)。 为避免银行冲突,基本策略与 合并内存请求的策略,例如。用于全局内存。在 Fermi 和较新的 GPU 上,多个线程可以读取相同的地址而不会引起存储区冲突,但通常情况下,存储区冲突的定义是多个线程从同一个银行。为了进一步了解共享内存以及如何避免存储库冲突,我推荐this topic 上的NVIDIA webinar。

【讨论】:

以上是关于CUDA中的warp和bank的机制是啥?的主要内容,如果未能解决你的问题,请参考以下文章

cuda基础---cuda通信机制

cuda基础---cuda通信机制

64位线程分离共享内存最小化bank冲突的策略

cuda为啥要开启32倍数的线程

CUDA 中 warp 调度程序的指令发布时间延迟是多少?

CUDA 的 resident warp 问题