我读Page-Locked Host Memory的Cuda Programming Guide和想知道在哪里使用函数创建时,这个固定的内存分配cudaHostAlloc?它在内核地址空间中吗?还是在进程地址空间中分配它?
CUDA的“页面锁定主机内存”(以及其他具有DMA功能的外部硬件,如PCI Express卡)分配在主机的物理内存中。分配被标记为不可交换(不可分页)和不可移动(锁定,固定)。这类似于mlocksyscall的操作“ 将部分或全部调用进程的虚拟地址空间锁定到RAM中,以防止将该内存分页到交换区。”
内核虚拟地址空间可以访问此分配(因为内核具有物理内存的完整视图),并且此分配也已添加到用户进程虚拟地址空间以允许进程访问它。
当您执行普通的malloc时,实际的物理内存分配可能(并且将)推迟到对页面的首次(写入)访问中。使用锁住/固定的内存时,所有物理页面都分配在锁定或固定调用内(例如mmap中的 MAP_POPULATE :“ 为映射填充(故障)页面表 ”),并且页面的物理地址不会更改(不交换,不移动,不压实...)。
CUDA文档:http: //docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1gb65da58f444e7230d3322b6126bb4902
__host__ ?cudaError_t cudaHostAlloc ( void** pHost, size_t size, unsigned int flags )在主机上分配页面锁定的内存。...
分配页面锁定且设备可访问的主机内存的大小字节。驱动程序跟踪为此功能分配的虚拟内存范围,并自动加速对诸如的功能的调用
cudaMemcpy()。由于该内存可以由设备直接访问,因此与使用诸如之类的功能获得的可分页内存相比,其读写带宽更高malloc()。分配过多的固定内存可能会降低系统性能,因为这会减少系统可用于分页的内存量。因此,最好保留使用此功能,以便为主机和设备之间的数据交换分配临时区域。...
此函数分配的内存必须用释放
cudaFreeHost()。
比较固定和未固定的内存:https : //www.cs.virginia.edu/~mwb7w/cuda_support/pinned_tradeoff.html “在固定和非固定内存之间进行选择”
固定内存是使用cudaMallocHost函数分配的内存,可以防止内存被换出并提高传输速度。非固定内存是使用malloc函数分配的内存。如“内存管理开销”和“内存传输开销”中所述,固定内存的分配和取消分配要昂贵得多,但对于大型内存传输,则提供更高的传输吞吐量。
CUDA论坛发布了来自txbob主持人的建议:https ://devtalk.nvidia.com/default/topic/899020/does-cudamemcpyasync-require-pinned-memory-/ “ cudaMemcpyAsync是否需要固定内存吗?”
如果您想要真正的异步行为(例如,复制和计算重叠),则必须固定内存。如果未固定,则不会有任何运行时错误,但副本将不是异步的-它将像普通的cudaMemcpy一样执行。
可用大小可能会因系统和操作系统而异。固定操作完成后,在Linux上的64GB系统上固定4GB内存不应对CPU性能产生重大影响。另一方面,尝试固定60GB可能会导致严重的系统响应问题。
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |