这主要来自《计算机体系结构:定量方法》一书。
该书指出,32 个线程的组在所谓的线程块中分组并一起执行,但展示了一个函数调用的示例,每个线程块有 256 个线程,CUDA 的文档指出每个线程块最多可以有 512 个线程。
函数调用如下所示:
int nblocks = (n+255)/256
daxpy<<<nblocks,256>>>(n,2.0,x,y)
有人可以解释一下线程块的结构吗?
在我看来,这个问题有点不清楚。我将强调螺纹翘曲和螺纹块之间的区别,我认为这很重要,希望它有助于回答真正的问题。
每个扭曲的线程数由硬件定义。通常,线程扭曲是 32 个线程宽 (NVIDIA(,因为 GPU 上的 SIMD 单元正好有 32 个执行通道,每个通道都有自己的 ALU(据我所知,情况并非总是如此;有些架构只有 16 个通道,即使线程扭曲是 32 个宽(。
线程块的大小由用户定义(尽管受硬件约束(。硬件仍将以 32 宽的线程扭曲执行线程代码。某些 GPU 资源(如共享内存和同步(不能在 GPU 上的任何两个线程之间任意共享。但是,如果线程属于同一线程块,则 GPU 将允许线程共享更大的资源子集。这就是为什么使用线程块背后的主要思想。