__global__
是 CUDA C/C++ 的函数修饰符,表示该函数为核函数- 核函数会在 GPU 上执行,但由主机代码调用
- 返回类型必须为
void
- 在调用kernel函数时,函数名后的
<<<b, t>>>
:b代表线程块的数目,t代表每个线程块的线程数目。
CUDA 的核函数指的是需要运行在 GPU 上的函数。CUDA C 在标准 C 的基础上,增加了一些修饰符,是为了更好地区分和编译 GPU 程序。我们接触的第一个修饰符就是 __global__
。该修饰符告诉编译器:被修饰的函数应当运行在 GPU 上,因此不能使用通用的 C 编译器对其编译,而是要使用 CUDA 提供的编译器(nvcc)。此外,核函数的输入和输出只能通过指针传递,因此返回类型都为 void
,且只能由主机调用。另一个修饰符 __device__
表示函数在 GPU 上运行,且不能被主机调用,只能由其他 __global__
修饰的函数调用。相对应地,__host__
修饰的函数应运行在 CPU 上,每次调用运行一次,且只能被主机调用。该描述符使用较少,因为所有未显式标明函数前置修饰符的函数均默认为主机函数。
调用核函数时,除了传递函数参数外,还必须要指用 <<<>>>
修饰,用来指定线程块的数量和每个线程块的线程数量。