CUDA有本身的存储器模型,线程在执行时将会访问处处于多个不一样存储器空间中的数据。cuda应用程序开发中涉及8中存储器,层次结果如图所示:缓存
每个线程拥有本身的私有存储器寄存器和局部存储器;每个线程块拥有一块共享存储器(shared_memory);最后,grid中全部的线程均可以访问同一块全局存储器(global memory)。除此以外,还有两种能够被全部线程访问的只读存储器:常数存储器(constant memory)和纹理存储器(Texture memory),他们分别为不一样的应用进行了优化。全局存储器、常数存储器和纹理存储器中的值在一个内核函数执行完成后将被继续保持,能够被同一程序中的其余内核函数调用。app
各种存储器比较:函数
存储器 | 位置 | 拥有缓存 | 访问权限 | 变量生命周期 |
---|---|---|---|---|
register | GPU片内 | N/A | device可读/写 | 与thread相同 |
local_memory | 板载显存 | 无 | device可读/写 | 与thread相同 |
shared_memory | CPU片内 | N/A | device可读/写 | 与block相同 |
constant_memory | 板载显存 | 有 | device可读,host可读/写 | 可在程序中保持 |
texture_memory | 板载显存 | 有 | device可读,host可读/写 | 可在程序中保持 |
global_memory | 板载显存 | 无 | device可读/写,host可读/写 | 可在程序中保持 |
host_memory | host内存 | 无 | host可读/写 | 可在程序中保持 |
pinned_memory | host内存 | 无 | host可读/写 | 可在程序中保持 |
说明性能
(1)Register
和shared_memory
都是GPU片上的高速存储器;优化
(2)经过mapped memory
实现的zero copy功能,某些功能GPU能够直接在kernel中访问page-locked memory。线程
GPU执行的是一种内存的加载/存储模型(load-storage model),即全部的操做都要在指令载入寄存器以后才能执行,所以掌握GPU的存储器模型对于GPU代码性能的优化具备重要意义。code