使用cudaHostAlloc在哪里分配固定内存?

使用cudaHostAlloc在哪里分配固定内存?,cuda,Cuda,我正在阅读《Cuda编程指南》中的Page Locked Host Memory,想知道在使用函数cudaHostAlloc创建时,该固定内存分配在哪里?它在内核地址空间中吗?还是在进程地址空间中分配?CUDA(以及其他支持DMA的外部硬件,如PCI express卡)的“页面锁定主机内存”分配在主机的物理内存中。分配被标记为不可交换(不可分页)和不可移动(锁定、固定)。这类似于“将调用进程的部分或全部虚拟地址空间锁定到RAM中,防止该内存被分页到交换区。” 这个分配可以通过内核虚拟地址空间访问

我正在阅读《Cuda编程指南》中的
Page Locked Host Memory
,想知道在使用函数
cudaHostAlloc
创建时,该固定内存分配在哪里?它在内核地址空间中吗?还是在进程地址空间中分配?

CUDA(以及其他支持DMA的外部硬件,如PCI express卡)的“页面锁定主机内存”分配在主机的物理内存中。分配被标记为不可交换(不可分页)和不可移动(锁定、固定)。这类似于“将调用进程的部分或全部虚拟地址空间锁定到RAM中,防止该内存被分页到交换区。”

这个分配可以通过内核虚拟地址空间访问(因为内核拥有物理内存的完整视图),并且这个分配也被添加到用户进程虚拟地址空间中,以允许进程访问它

在执行普通malloc时,实际的物理内存分配可能(并且将)推迟到对页面的第一次(写)访问。使用mlocked/pinted内存,所有物理页都在锁定或pinding调用中分配(如MAP_POPULATE in:“为映射填充(预故障)页表”),页的物理地址不会更改(无交换、无移动、无压缩…)

CUDA文档:

\uuuu主机\uuuu​cudaError\u t cudaHostAlloc(无效**pHost,大小,无符号整数标志)

在主机上分配页锁定内存。

分配被页面锁定并可供设备访问的主机内存大小字节。驱动程序跟踪此函数分配的虚拟内存范围,并自动加速对函数的调用,如
cudaMemcpy()
。由于设备可以直接访问内存,因此与使用诸如
malloc()
等函数获得的可分页内存相比,它的读写带宽要高得多。分配过多的固定内存可能会降低系统性能,因为这会减少系统可用于分页的内存量。因此,最好少用此功能为主机和设备之间的数据交换分配临时区域

必须使用
cudaFreeHost()
释放此函数分配的内存

比较固定和未固定内存:“在固定和未固定内存之间选择”

固定内存是使用cudaMallocHost功能分配的内存,可防止内存被调出,并提高传输速度。非固定内存是使用malloc函数分配的内存。如内存管理开销和内存传输开销中所述,固定内存的分配和释放成本要高得多,但为大型内存传输提供了更高的传输吞吐量

CUDA论坛发布了txbob版主的建议:“cudaMemcpyAsync需要固定内存吗?”

如果您想要真正的异步行为(例如复制和计算的重叠),那么必须固定内存。如果没有固定,则不会出现任何运行时错误,但复制不会是异步的,它将像普通的cudaMemcpy一样执行

可用大小可能因系统和操作系统而异。在锁定操作完成后,在Linux上的64GB系统上锁定4GB内存不会对CPU性能产生显著影响。另一方面,尝试固定60GB可能会导致严重的系统响应问题