第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 A[N],B[N],C[N];

本文详细介绍了CUDA编程模型,包括执行结构、内核函数、线程层次、存储器结构与线程映射机制、通信机制以及CUDA的软件体系。CUDA程序在主机与设备间交替运行,内核函数在GPU上并行执行。线程组织为grid和block,通过线程ID访问存储器。通信机制中,block内的线程通过共享存储器通信,grid内的线程借助全局存储器。CUDA软件体系由库函数、运行时API和驱动API构成,nvcc编译器负责编译流程。
最低0.47元/天 解锁文章
1182

被折叠的 条评论
为什么被折叠?



