GPU和CPU本质上有很大的不同,CPU具有较大的缓存(cache)和较快的计算核心,可以处理较复杂的运算。
然而GPU不具备这样的条件,缓存较小且单核心计算速度也没有CPU快,只是取而代之的GPU具有大量的计算核心(通称CUDA Core),故其优势在于适合进行同时间的大量运算。一颗顶级的CPU核心数量可达56核心(Intel Xeon Platinum 9282),计算线程(Threads)达112,但低阶的GPU(如Quadro P620)的核心数就有512(GPU的核心数等于计算线程数量)。
当然这不代表GPU比CPU厉害,而是表示两者适合的计算类型不同。而GPU核心数量多的特点,也需要配合其平行化计算方式,才能将其优点发挥出来,所以由下图可知,GPU在计算时所有核心可高度平行进行计算,而CPU则是以顺序性(sequential)的方式进行计算。GPU是专为图像处理所需的计算密集、高度并行计算设计的。上述应用,都具有计算数据量大且可高度平行化的特性,也就最适合使用GPU来计算。
CPU和GPU设计架构及计算特性
如何使用GPU进行加速运算?
使用GPU进行加速运算方法主要有三大类:
- 使用商业软件包
- 使用开源或官方函数库
- 自行编程CUDA
1、使用商业软件包
第一项种类繁多,其中又以有限元素分析领域最多,此领域相关计算包含流体力学分析、热传导分析、电磁场分析或应力分析等等应用。由于范围涵盖IC设计、建筑设计、甚至许多交通工具或化工厂也需通过这类软件进行仿真分析,故开发这类软件有很大的商业价值。
2、使用开源或官方函数库
NVIDIA官方常见的如矩阵计算函数库cuBLAS、频率分析函数库cuFFT、深度学习函数库cuDNN等等,但也可从如GitHub社群上搜寻。上述两项也可参考NVIDIA官方收录的「GPU-ACCELERATED APPLICATIONS」,内容已将各领域可使用GPU的软件或套件收录并提供简介,让开发者可容易找到合适的应用套件。
3、自行编程CUDA
第三项就必须通过程序语言进行CUDA撰写,不过依照程序语言不同,能够操控的自由度也不相同,其中较底层的程序语言C/C++或Fortran属于自由度最高的程序语言,可利用程序语言控制GPU计算,甚至可针对本机内存与GPU内存数据传输进行优化。其次则为Python,Python也是现今最主流进行人工智能应用开发的程序语言。实现的方式包含PyCuda或是使用Numba函数库,PyCuda的使用者还是需要在核心程序撰写CUDA C,当然其效能几乎也等同于撰写CUDA C的效能,而Numba则是通过装饰器(decorator)于函数声明,并使用函数签名(function signature)完成呼叫CUDA的设定。此外,Java、R、C#等也都可以支持CUDA,但都不如C/C++或Fortran直接。