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个字节.而且我我们也会在上面看到,虚拟内存的另一个能力就是可以把不连续的内存地址融合成一个在逻辑上是连续的地址
之后还有一个在CUDA2.2引进的特性叫可共享的锁页内存
联系客服