1.warp divergence
线程束分化指的是线程束的线程在遇到条件分支时,如果同一个 warp 中的线程走的是不同的分支,因为硬件只能发射同一个指令,所以不同分支会串行执行。
解决线程束分化的方法:设计的时候尽量同一个 warp 走相同的分支;使用运算指令代替条件运算符;重排数据走相同分支;循环条件统一退出。
2.occupancy
指的是活跃 warp 数占理论最大值的百分比,受寄存器、共享内存和 block 内线程的限制,因为寄存器在 sm 上是有限的,如果超过,局部变量会被分配到全局内存,很慢,共享内存的大小也是有限的,如果一个 block 过多, block 就得减少,sm 上的线程数是有限的。
occupancy 指标存在的意义:通过多个 warp 的切换可以隐藏等待内存的延迟。
3.直接寄存器通信
主要用于同一个 warp 中的线程通信比如__shfl_sync,寄存器通信比共享内存通信更高效
寄存器通信可以解决 bank conflict 的问题
4.同步的方法
既有 block 级别的也有 warp 级别的,这些不同级别的同步方法可以直接避免对全局内存的竞争,如果所有 block 所有线程都直接竞争结果就是效率会大大下降,在不同层面竞争效率会提升。
warp 级别的同步方法可以通过 mask 设置哪些同步。
block 级别同步和共享内存一般是结合起来使用的。