CUDA核函数
在GPU上调用的函数成为CUDA核函数(Kernel function),核函数会被GPU上的多个线程执行。每个线程都会执行核函数里的代码,当然由于线程编号的不同,执行的代码路径可能会有所不同。下面的几行代码是向量加计算的CUDA核函数:
__global__ void vectoradd (int *a, int *b, int *c, int n){
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < n){
c[i] = a[i] + b[i];
}
}
vectoradd<<>>(d_a, d_b, d_c, N);
从这段代码可以看出CUDA核函数的几个特征:
-函数的最前面是声明标识符__global__,该标识符表示这个函数可以在GPU上执行。需要指出的是尽管是在GPU上执行,但是仍然是由CPU端发起调用的
-核函数调用时需要用<<<...>>>符号来指定线程配置
-在核函数内部可以调用CUDA内置变量,比如threadIdx,blockDim等
-核函数相对于CPU代码是异步的,也就是控制会在核函数执行完成之前就返回,这样CPU就可以不用等待核函数的完成而继续执行后面的CPU代码
关于线程的配置以及内置变量将会在后面详细介绍。CUDA核函数除了上面提到的几个特征之外,还有一些限制:
-核函数内部只能访问device内存。因为核函数是执行在设备端,所以只能访问设备端内存。
-必须返回void类型。我们知道核函