核函数(Kernel function)
核函数
-
核函数在GPU上进行并行执行
-
注意:
- 限定词__global__修饰 [双下划线]
- 返回值必须是void
-
形式:
-
_global_ void kernel_function( argument arg){
printf(“hello world from the GPU\n”);
}
-
void __global__kernel_function( argument arg){
printf(“hello world from the GPU\n”);
}
-
核函数的特点:
- 核函数只能访问GPU内存
- CPU和GPU是异构架构
- CPU有自己的内存, GPU有自己的显存
- CPU和GPU之间进行内存访问只能通过PCIe总线进行
- 核函数不能使用变长参数
- 核函数不能使用静态变量
- 核函数不能使用函数指针
- 核函数具有异步性
CUDA程序编写流程:
int main(void){
主机代码 //一般对GPU进行配置以及数据处理的内容
核函数调用 //进行并行加速数据处理
主机代码 //一般将GPU运行后的数据回传给CPU主机, 还会进行对CPU GPU内存的释放工作
return 0;
}
#include <stdio.h>// CUDA核函数(__global__修饰符表示在GPU上执行)
__global__ void hello_from_gpu(){printf(“hello world from the GPU\n”); // GPU端打印
}int main(void){// 调用核函数:1个块,每个块1个线程(总线程=1)// 格式如下:// 核函数名称<<<网格配置(grid), 块配置(block), 其他参数>>>(); // <<< ... >>>:CUDA特有的语法,用来指定核函数在GPU上的执行配置。// 1, 1:表示网格(grid)中的块(block)数量和每个块中的线程(thread)数量// 总线程数 = 网格中的块数 × 每个块中的线程数 = 1 × 1 = 1// CUDA的核函数并行执行,通过网格和块的层级结构,可以灵活地组织线程hello_from_gpu<<<1, 1>>>();// 等待GPU操作完成(否则主机代码可能提前退出)// 强制主机(CPU)等待GPU完成所有操作,确保打印输出可见// 因为GPU操作是异步的,若不等待,主机代码可能提前退出,导致看不到打印结果。cudaDeviceSynchronize();return 0;
}