我对CUDA如何工作有点困惑,线程是否执行相同指令(SIMT)但使用不同索引访问的单个数据?或者是否考虑了不同的数据" (所以它也是SIMD)?
SMX是整个GPU芯片吗? SMX应该由几个SP组成,每个SP一次执行一个线程,是一个只分配给一个SP的线程块吗?
我现在有点困惑
答案 0 :(得分:12)
网格启动是线程块的1-3维启动。线程块是1-3维线程组。 CUDA工作分配器将线程块分配给SMX单元。低端设备可能有1个SMX单元。高端设备可以具有> 10个SMX单元。
SMX单元在称为warps的32个线程组中中断线程块。 SMX单元最多可以分配64个warp或16个块。由于资源限制(块,扭曲,每个线程的寄存器,每个块的共享内存或障碍),数量可能会更少。
每个SMX单元都有4个warp调度程序,每个调度程序负责warp的一个子集。在每个循环中,warp调度程序将选择符合条件的warp并发出1或2条指令。为了双重问题,两个指令必须是独立的并且使用不同的执行单元。例如,可以将一条指令分派给浮点单元,将第二条指令分配给加载存储单元。
除了双重发布warp调度程序之外,还可以向warp发出背对背的独立指令。当检测到依赖关系,或者下一条指令的执行单元忙,或者warp没有指令(等待获取)时,如果符合条件,warp调度程序将选择不同的warp。
每个线程都有自己的一组通用寄存器,条件代码,谓词代码和本地存储器。每个线程都是线程块的成员。所有线程都可以访问包含共享内存和障碍的线程块资源。网格启动中的所有线程都可以访问网格资源,包括常量内存,纹理绑定和表面绑定。所有线程都可以访问全局内存。