CUDA学习笔记-硬件构架
https://github.com/ArchaeaSoftware/cudahandbook
http://www.cudahandbook.com/
这个是最近全新一版的书
这个是我目前看的书
代码的话托管至GItHub,大家在学习的时候可以自己查看
这个是最简单的一个图
可以看到就是很简单的一个图,但是还缺点东西就是CPU和GPU一定不是直接相连的,一定还有别的芯片组,是什么呢?是PCIe!
也就是这个东西
关于更多详细的论述,大家可以就去看书籍
我这里就放这种通俗易懂的构架图
特别的还有一个对称的多处理器簇.这个怎么理解就是多个处理器的内存视图要通过内存控制器的同意处理,确保系统"看到的是同一个内存视图.有一点归一化的意思~
后来这样的设计就变成了这样,直接把北桥的内存控制集成到CPU
那视角切换到我们的多个CPU,这个构架图就是不太一样了
可以看到每一个节点(CPU),都有自己的内存带宽池
在多线程的应用或者系统内,依赖于北桥和CPU内的缓存一致性.
对于非本地的内存区读取和CPU的内存区读取有性能上面的差异,所以直接就是将CPU的缓存做的巨大
集成GPU的意思是集成到芯片组
以前的内存池就给CPU用,现在这样的设计的话,GPU和CPU是公用的
当然在运行的是
英伟达的SLI技术可以让程序员操作多GPU的时候,感觉就像操作一个GPU
因为GPU的内存地址是互相共享的
地址空间
人们早期发现给内存地址连续标号是有益的,那么.虚拟地址就是这个发现的衍生:
比如现在又一个16位地址的内存
它的位置是0~65535,我们定义16的值为地址,地址的计算和实体内存内的位置的对应称为寻址(adressing).早期的计算机会执行这种操作,但是后来,多个程序一起运行,每个程序都会一起读取这块共有的内存块,可以在任意的位置进行读取.这肯定是不被允许的,稳定性先不说,别有心机的程序员可以攻击了,或读取或写.
那咋办?看下图
这个就是目前的运行程序的内存视图
当一个程序
开始执行的时候,会给你一块内存,属于你自己的内存.你未经操作系统的允许不可以看其他程序的内存里面有什么.程序申请的时候其实都是申请的都是操作系统的虚拟的地址(就是和实体内存排布不匹配),之后操作系统会计算出这个虚拟地址和实体内存之间的真实的mapping关系.就是起到到了转换层的作用.
在多数的操作系统里面,虚拟内存的单位是页这个单位,至少有4069个字节.而且我我们也会在上面看到,虚拟内存的另一个能力就是可以把不连续的内存地址融合成一个在逻辑上是连续的地址
主机端存在虚拟内存,主机内存不足是会将内存数据交换到虚拟内存中,虚拟内存就是主机中的磁盘空间,需要该页时再重新从磁盘加载回来。这样做可以使用比实际内存更大的内存空间。
锁页内存允许GPU上的MDA控制器在使用主机内存时不用CPU参与。GPU上的显存都是锁页的,因为GPU上的内存时不支持交换到磁盘的。锁页内存就是分配主机内存时锁定该页,让其不与磁盘交换。
CUDA中锁页内存的使用可以使用CUDA驱动API( driver API’s)cuMemAllocHost()或者使用CUDA的运行时API(runtime API)中的cudaMallocHost()。除此之外还可以直接用主机上Malloc()分配的空间,然后将其注册为锁页内存(使用cudaHostRegister()函数完成注册)。
使用锁页内存的好处有以下几点:
1.设备内存与锁页内存之间的数据传输可以与内核执行并行处理。
2.锁页内存可以映射到设备内存,减少设备与主机的数据传输。
3.在前端总线的主机系统锁页内存与设备内存之间的数据交换会比较快;并且可以是write-combining的,此时带宽会跟大。
之后还有一个在CUDA2.2引进的特性叫可共享的锁页内存