我是学习CUDA并行编程的新手。现在我对设备的全局内存访问感到困惑。这是关于翘曲模型和聚结。
有几点:
-
据说一个方块中的线会分裂成经线。每根经线最多有32根线。这意味着所有这些具有相同扭曲的线程将使用相同的处理器同时执行。那么半曲速的感觉是什么呢?
-
当涉及到一个块的共享内存时,它将被拆分为16个组。为了避免库冲突,多个线程可以同时读取一个库,而不是在同一个库中写入。这是正确的解释吗?
提前感谢!
-
"半曲速"的主要用法应用于CUDA处理器在费米代(例如"特斯拉"或GT200代,以及原始的G80/G92代)。这些GPU是经过体系结构设计的带有SM(流式多处理器——GPU内部的硬件块)少于32个线程处理器。warp的定义仍然相同,但实际的HW处决一次发生在"半扭曲"中。实际上粒度细节比这更复杂,但足以假设执行模型导致发出内存请求根据半经线(即经线内的16根线)的需要。因此,命中内存事务的完全扭曲将生成该事务总共有2个请求。
Fermi和更新的GPU每个至少有32个线程处理器SM因此,内存事务在弯曲因此,内存请求是按每个扭曲发出的水平,而不是每半个翘曲。但是,内存已满的请求一次只能检索128个字节。因此,对于数据大小每个事务的每个线程大于32位控制器仍然可以将请求分解为半翘曲大小。
我的观点是,尤其是对于初学者来说,没有必要对半曲速有详细的了解。一般来说足以理解它指的是一组16个线程一起执行,这对内存请求有影响。
- 共享内存,例如费米类GPU分为32个银行。上一个GPU它被分割成16个银行。银行冲突随时发生单个银行由同一个银行中的多个线程访问内存请求(即源自相同的代码指令)。为了避免银行冲突,基本策略与合并内存请求的策略,例如全局内存。在Fermi和更新的GPU上,多个线程可以读取相同的地址而不会引起库冲突,但通常,库冲突的<em]定义>是指多个线程从同一库读取。为了进一步了解共享内存以及如何避免银行冲突,我建议举办NVIDIA网络研讨会