zz https://www.zhihu.com/question/35361192/answer/62410540?from=profile_answer_card
要弄清楚这个问题需要充分理解现代 GPU 的架构。受限于篇幅,就不展开了。
从硬件调度的角度上来看:
1. Grid:GPU (GPC) 级别的基本调度单位。
2. Block (CTA):SM 级别的基本调度单位。
3. Warp:ALU 级别的基本调度单位。
从资源分配和通信的角度来看:
1. Grid:共享同样的 Kernel 和 Context。
2. Block (CTA):同一 CTA 的线程运行在同一个 SM,因此同一 CTA 中的不同线程可以通过 Shared Memory 通信,并共享 L1 cache(只读)。
3. Warp:32 宽度的 SIMD,占用同一块向量寄存器,线程间可以通过特殊指令交换寄存器中的数据。
从硬件调度的角度上来看:
1. Grid:GPU (GPC) 级别的基本调度单位。
2. Block (CTA):SM 级别的基本调度单位。
3. Warp:ALU 级别的基本调度单位。
从资源分配和通信的角度来看:
1. Grid:共享同样的 Kernel 和 Context。
2. Block (CTA):同一 CTA 的线程运行在同一个 SM,因此同一 CTA 中的不同线程可以通过 Shared Memory 通信,并共享 L1 cache(只读)。
3. Warp:32 宽度的 SIMD,占用同一块向量寄存器,线程间可以通过特殊指令交换寄存器中的数据。
一个 warp 对应一条指令流,等价于一个同时操作 32 个数据的 thread。所以出现 warp 的地方直接换成 thread 理解也没问题。
以 block 的形式组织 warp 是为了实现可扩展性。全局同步开销太大,但是如果让一个 block 中的 warp 通过 barrier 同步来通信开销就小得多,这样设计出来的程序性能才有可能随着 ALU 数量的增加线性增长。
以 block 的形式组织 warp 是为了实现可扩展性。全局同步开销太大,但是如果让一个 block 中的 warp 通过 barrier 同步来通信开销就小得多,这样设计出来的程序性能才有可能随着 ALU 数量的增加线性增长。
作者:程亦超
链接:https://www.zhihu.com/question/35361192/answer/62415387
来源:知乎
著作权归作者所有,转载请联系作者获得授权。