第3章 CUDA编程基础
3.3 CUDA编程模型
CUDA架构第一次引入了主机(host)端与设备(device)端的概念。如下图所示,一个完整的CUDA程序由主机代码和设备代码两部分组成。主机代码在主机端CPU上串行执行,是普通的C代码;设备代码部分在设备端GPU上并行执行,称为内核(kernel)。kernel函数不是一个完整的程序,而是任务中能被分解为并行执行的步骤的集合。CPU执行的串行程序负责kernel启动之前进行数据准备和设备初始化的工作,以及在kernel之间进行一些串行计算。GPU执行的并行部分是在被称为grid和block的两个层次并行中完成的,即每个kernel函数存在两个层次的并行:网络(grid)中的线程块(block)间并行金额线程块中的线程(thread)间并行。
3.3.1 执行结构
CUDA程序在执行过程中,主机代码与设备代码交替运行,程序从主机端的串行代码开始运行,当运行至设备代码时,调用内核函数,并切换到设备端,启动多个GPU线程(thread)并行执行设备代码。每一个线程块(block)均包含多个线程,执行相同的指令,达到线程块内的并行,同时在每个线程网格(grid)中,实现不同线程块之间的并行。设备完成计算后,返回主机线程,主机继续执行串行操作。重复以上过程,直到程度执行完毕。
3.3.2 内核函数
先看一个简单的C文件,实现长度均为N的数组A和数据B的相加,结果保存在数组C中。
void vectorAdd(float *A, float *B, float *C, int N)
{
int x=0;
while(x<=N-1)
{
C[i] = A[i] + B[i];
x++;
}
}
int main()
{
float<