CUDA编程GPU内存总结

Posted Dream_yz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CUDA编程GPU内存总结相关的知识,希望对你有一定的参考价值。

CUDA编程GPU内存总结

CUDA内存主要包括:分页内存、锁页内存、零拷贝内存、统一虚拟寻址、统一内存地址

分页内存:

简介:使用cudaMalloc()申请的主机内存,即可分页内存。
特点:可分页内存传输数据到设备时,首先需要分配固定内存,在传递到设备端。对主机而言,分页内存可提高主机性能。

锁页内存:

简介:使用cudaMallocHost()申请锁页内存,需使用cudaFreeHost()释放锁页内存。
特点:设备可直接访问锁页内存,可提高传输性能。

零拷贝内存:

简介:利用cudaHostAlloc()申请零拷贝内存,改函数的flags标志有四种:

  • cudaHostAllocDefalt(等同于cudaMallocHost函数);
  • cudaHostAllocPortable;
  • cudaHostAllocWriteCombined;
  • cudaHostAllocMappe(零拷贝内存)。

主机访问零拷贝内存,直接使用可以。
设备访问零拷贝内存:利用cudaGetDevicePointer((void **)&DevicePtr, void *HostPtr, unsigned int flag)获取设备零拷贝主机内存对应的设备指针,然后将设备指针传入kernel函数。设备就可直接访问主机内存了。

适合以下情况使用:

  • 设备不足时,可利用主机内存;
  • 可避免设备和主机间的显示传输;
  • 可提高PCI-e传输速率。

特点:主机无法访问设备内存,设备无法访问主机内存,但主机和设备均可访问零拷贝内存。

统一虚拟地址

简介:利用cudaHostAlloc()获取的零拷贝内存,在UVA(统一虚拟地址)之前,核函数使用的指针必须为经过cudaGetDevicePointer()获得的设备指针。而有了UVA之后,则省去了这一步,核函数直接使用主机指针。

统一内存地址

简介:利用cudaMallocManaged()申请托管内存,“统一内存”创建了一个托管内存池,内存池中已分配的空间,可以用相同的内存地址(指针)在CPU和GPU上进行访问。
特点:完成主机与设备数据的自动拷贝,消除重复指针。

以上是关于CUDA编程GPU内存总结的主要内容,如果未能解决你的问题,请参考以下文章

cuda GPU 编程之共享内存的使用

CUDA 内存统一分析

CUDA学习和总结1

CUDA编程CUDA入门笔记

CUDA并行程序设计系列GPU技术简介

关于CUDA编程模型的问题