CUDA编程之其硬件架构的介绍
1.CPU配置 : 系统输入和输出的比特数据,一些比如键盘的外设,和CPU的输入和输出都需要芯片组,现在芯片组被一分为二,一个连接大多数的外设和系统的地方称为南桥;另外一个包含图形总线(PCIe)和内存控制器(通过前端总线与内存相连)的北桥;每一个PCIe2.0的通道,可以提供500MB/s的带宽,对于一个外设其通道数可以是1,4,8,16,GPU需要平台所有的外设的最大带宽
2 前端总线:内存与前端总线相连构成内存控制器,在涉及的时候需要考虑到GPU的延迟的容忍度以及大量内存带宽的内在需求。
3 映射锁页内存:它是被映射到CUDA地址空间的锁页主存,在CUDA内核程序里可以直接对其读入和写出,由于CPU和GPU的页表更新了,GPU指向该缓冲区的指针也必须使用主要是查询设备指针cuMemHostGetDevicePointer()或者是cudaHostGetDevicePointer()函数来查询。
4 统一寻址(UVA):1,初始化程序执行CPU地址空间的大型的虚拟分配;第二,将GPU分配的内存映射到上述的地址空间 (对于映CPU和GPU射锁页分配,CPU和GPU的指针是相同的),对于其他的类型的分配CUDA可以判断那个内存的那个设备cudaMemcpy()和cuMemcpyHtoD(),cuMcpyDtoH()可以被cuMemcpy()h和cudaMemcpy()代替,当UVA实行的时候,可以通过cuMemRegisterhost()函数来进行对锁存的系统内存。
5锁页主机内存和命令缓冲区 :GPU是通过直接访问内存(DMA)来访问CPU的锁页内存,其中锁页操作可以使硬件直接访问CPU的内存,cuda一直通过cudaMallocHost()来践行分配锁页内存,锁页缓冲区的主要应用将命令提交给GPU,同时CPU将命令写在锁页缓冲区是为了给GPU来运行这些命令,CPU是如何循环这些命令缓冲区,是通过在CPU把锁页缓冲区中写的命令已经占满这个空间,当GPU已经执行了命令后,那么CPU就在已经被GPU执行后的锁页命令存储区进行写吓一跳命令。
最后有关CPU和GPU的同步运行的讲解:cuda的大多数GPU命令涉及内存的复制或内核程序的启动执行,这样gpu必须要向CPU汇报自己的进程,这是命令缓存区和同步位置都在锁页主机内存中,,其中同步位置是共享位置(CPU和GPU 都可以直接访问)cuda需要cuCtxSynchronize()he cudaCtxSynchronize()来检查GPU请求的最近的同步值,如果CPU写入命令为8后,在紧接着是上面的程序,则改程序一直等待,知道共享同步值大于8后位置,其中cuEventRecord()函数的作用是将新的同步值邪恶如共享内存中cuEventQuery()和cuEVentSynchronize() 来检查和等待这个事件的同步值