本来不想学的,没成想,我的程序因为数据量太大而且在一些问题导致用C++写的代码运行速很慢,我试着把我写的c++源码迁移到python里面,用pycuda试了一下,唉,速度还是不咋地,看来只能是学习CUDA C++编程了,不然,我这电脑跑死了,模型和数据都跑不出来。
废话不多说了,先给介绍一下我用的书:CUDA C编程权威指南。一个专门搞高性能计算的兄弟给我推荐的这本书,他说这相当于高性能计算的圣经,本着学习的态度,我搞了一本,接下来的一个多月里面,除了Python科学计算以外,这本书的学习也是重中之重,毕竟,c++代码花了好长时间才调好的,另外的话就是,自己比较喜欢C++的编程风格,给人一种很硬气的感觉,本书的学习,完全是按着书上的讲解顺序来的,完全可以和书对的上。
今天呢,先从异构计算架构开始学起来:
计算机的内部结构,不会的看计算机组成原理去,简单来说,GPU和CPU是俩独立的处理器,他们是通过单个计算节点中的PCI总线来连接的,这种架构下,Gpu实际上是离散设备从同构系统到异构系统的转变,是高性能计算历史上的一个里程碑,同构计算用的是同一个结构下的一个或者是多个处理器来执行一个应用,而异构计算用的是一个处理器架构来执行一个应用,为任务选择适合她的架构,使得其性能有所改进。
一个典型的异构计算节点包括两个多核cpu插槽和两个或者更多个众核gpu,gpu不是一个独立的运行平台而是cpu的协处理器,所以,gpu必须通过PCIe总线和基于cpu的主机相连来进行操作:
![](https://i-blog.csdnimg.cn/blog_migrate/2b8fe5774cc12e395144dadc81999df5.png)
图一:GPU和CPU之间的连接
一个异构应用要包括两个部分:
主机代码(CPU上运行)
设备代码(GPU上运行)
异构平台上执行的应用通常由CPU初始化,在设备端加载计算密集型任务之前,CPU代码负责管理设备端的环境、代码、数据,计算密集型应用的时候,会有很多并行数据的程序段,GPU就是用来提高这些并行数据的执行素的的,通俗的来说,GPU就是一个非常常见的硬件加速器。
描述GPU容量的两个主要特征:
CUDA核心数量
内存大小
相应的评估GPU性能的指标:
峰值计算性能
内存带宽
峰值计算性能是用来评估计算容量的一个指标,一般定义的是每秒能够处理的float或者double的数量,常用的单位是GFlops(每秒十亿次浮点运算)或者是TFlops(每秒万亿次浮点运算),内存带宽就是从内存中读取或者是写入数据的比率,通常用的是GB/s,我的电脑很老了,GPU用的还是1050Ti,打个游戏还凑活吧。
我们可以从两个方面来区分GPU和CPU应用的范畴:
![](https://i-blog.csdnimg.cn/blog_migrate/8265681759ce19af1ddf99a2571520b7.png)
图二:GPU和CPU的应用范畴
这一看我最初的想法就是对的,我的数据规模不但大,而且并行处理非常有优势,同时,我正好想起来之前看论文的时候,就有很多人在用MPI进行多线程计算来解决我这方面的问题。
这样子呢,其实就是:CPU上执行串行部分或者是任务并行部分,在GPU上执行的是数据密集型并行部分:
![](https://i-blog.csdnimg.cn/blog_migrate/d7d43ae4b4de1c26c8897a66f57704c5.png)
图三:计算分工
那么,为了支持这种架构嘞,NVDIA就创造出了CUDA异构计算平台,利用NVDIA GPU中的并行计算引擎来解决复杂问题,这个扩展很多的,你可以用CUDA来对(C、C++、Fortran、Python)来进行加速。
![](https://i-blog.csdnimg.cn/blog_migrate/6950ce587e5874bebb4291c2d5fc8ee1.png)
CUDA提供了两层API来管理GPU设备和组织线程:
1、CUDA驱动API(低级API)
2、CUDA运行API(高级API)
这俩是相互排斥的,只能是使用其中的一个,从良这种混合调用函数是绝对不可以的,这本书里面全部用的运行时API
一个CUDA程序包含了两个部分的混合:
CPU上运行的主机代码
GPU上运行的设备代码
主机代码是标准的编程语言,用编译器进行编译,设备代码,就是核函数,用的是扩展的带有标记数据并行函数关键字的CUDAC/C++语言白那些,设备代码通过CUDAnvcc进行编译,连接阶段,在内核函数调用和显示GPU设备操作中添加CUDA运行时库
如果说想在GPU上建立应用程序,可以使用CUDA工具包,网上搜,是有的。
好了,基础的知识讲完了,明天要开始看怎么用了。