核函数
-  
核函数在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;
}