Duxy's

a digged hole

GPU的线程原理

GPU确实好用,在这里记录一下Grid, Block相关的概念。

在Cuda中,使用global来定义核函数,也就是使用CPU执行,GPU执行的函数。核函数的调用需要指定线程数量,在核函数内部又可以获取线程相关的信息。这个东东就有点让人晕乎晕乎了。
其实看下图,应该就比较好理解了。

一个核函数的调用,其实就是按照上图建立线程模型。整体是一个grid,其大小由gridDim唯一确定。grid中的每一个位置是一个block,其位置是由blockIdx确定的,而block的大小是由blockDim确定的。block中的每一个位置是一个thread,其位置是由threadIdx确定的。
因而,在核函数内部,可以使用gridDim获取grid的大小,使用blockIdx获取block的大小;可以由blockIdx获取当前线程在grid中的位置,由threadIdx获取当前线程在block中的位置。

grid与block的大小是怎么来的呢?在核函数的调用中:Kernal<<>>(...)的参数中,就定了grid与block的大小了。通常设的是一维的,如果要完整设定,可以使用dim3类型定义。至于设多大比较好?这就要根据实际情况来了,理论上:分得比较细会更多的占用运算资源,但是存储资源开销会比较大。