基于Cuda开发GPUGPU程序时,最重要的仍然是内核的设计,这是Cuda性能优化的难点,提供了不少岗位,养活了一大批工程师。这里以一个相对简单的的求平方和算法为例,从编程和优化,调试几个维度,介绍利用cuda开发并行计算程序时的关注点。
cuda API
NVIDIA CUDA计算架构为开发者提供了三个层面的API,分别是Cuda Lib, Cuda RT, 和cuda driver。cuda driver是比较底层的API,用法复杂但是性能高,可以深度二次优化,对于研发能力强的用户可以在这个层次上做出高性能的计算方案出来,其次是最常用的cuda runtime,也就是我们常用的cuda API.最上层是cudalib,cudalib提供给研发能力一般,希望快速上手的开发者,包含各类已经预先开发好的数学库和数学函数。
cuda编程模型
在CUDA编程模型中引入主机端和设备端的概念,CPU是主机端,GPU属于设备端,主机端仅有一个,而设备端可以同时有很多(比如NVLINK 8卡互联),CPU负责复杂逻辑处理和运算量少的计算,而GPU负责运行简单但是计算量大的并行计算。
一个kernel函数对应一个grid,每个grid根据需要配置不同的block数量和thread数量。从编程模型可以看出,cuda包含三个逻辑层,grid, block和thread.