CPU与GPU统一虚拟内存(CUDA UM)原理 |
您所在的位置:网站首页 › 产生缺页中断的原因是什么 › CPU与GPU统一虚拟内存(CUDA UM)原理 |
CPU与GPU的统一内存(CUDA Unified Memory)原理
文章目录
CPU与GPU的统一内存(CUDA Unified Memory)原理
一、UM下的CUDA编程
二、UM的实现原理
1. cudaMallocManaged分配CUDA内存
2. CPU缺页中断处理
3. CUDA Kernel 运行:
三、UM的性能缺陷及优化
1.用 `cudaMemPrefetchAsync` 避免缺页中断
2.用`cudaMemAdvise`告知分配内存的特性
四、其他 (TBD)
1.与UM相关的API简介
2.一些CUDA Memory的优化方法
五、参考文献
一、UM下的CUDA编程
在PCIE接口上插上GPU,就变成了我们Desktop形式的CPU/GPU, CPU与GPU分离,各自有属于自己的物理地址: 在这种情况下,我们比较熟悉的CUDA编程是用cudaMalloc和cudaHostMalloc分别分配device和host内存,先后显示调用cudaMemcpy进行拷贝。 但是使用的UM (Unified Memory)的cudaMallocManaged就不需要显示的将hostMem内容拷贝到deviceMem了,例子如下: { char * array = nullptr; cudaMallocManaged(&array, N) //分配内存 fill_data(array); qsort(array); //GPU process cudaDeviceSynchronize(); use_data(array); //CPU process cudaFree(array); }同一个指针array可以同时分别在CUDA和CPU使用,但编程框架中只显示分配了个地址数值。所以必然有底层逻辑在CPU和GPU各自独立的空间之间拷贝了数据,使其表现为程序员看似GPU和CPU使用了同一段地址。 那么问题来了,CUDA Host Runtime悄悄的做了什么。 二、UM的实现原理我们以如上的程序为例子: 1. cudaMallocManaged分配CUDA内存Pascal及以上架构的GPU是可以处理页错误(Page Fault)的,cudaMallocManaged是cudaRuntimeAPI,其不仅仅只为CPU分配内存,还将CPU端的页信息发送到GPU上: 图中的例子所示,假设array占用两个内存页,内存分配在GPU上,但cudaRuntime同时在CPU端创建了指针array的内存页: 值得注意的是,由于CPU和GPU都用相同数值的array指针,所以页的页号在CPU和GPU端是相同的。 2. CPU缺页中断处理接下来程序在CPU端调用fill_data(array)但实际上CPU没有为array实际分配内存空间,仅仅是有保留的页表存在,所以必然会产生缺页中断: 此时的缺页中断会促使GPU内存的内容通过PCIE总线migrate到CPU内存当中 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |