【问题标题】:Where is pinned memory allocated using cudaHostAlloc?使用 cudaHostAlloc 分配的固定内存在哪里?
【发布时间】:2018-03-25 19:59:03
【问题描述】:

我正在阅读 Page-Locked Host Memory 中的 Cuda Programming Guide 并想知道使用函数 cudaHostAlloc 创建时这个固定内存分配的位置?它在内核地址空间中吗?还是分配在进程地址空间中?

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

    当您执行普通 malloc 时,实际的物理内存分配可能(并且将会)推迟到对页面的第一次(写入)访问。使用 mlocked/pinned 内存时,所有物理页面都在锁定或 pinning 调用中分配(如 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 )

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

    分配页面锁定且可供设备访问的主机内存的 size 字节。驱动程序跟踪分配给此函数的虚拟内存范围,并自动加速对cudaMemcpy()等函数的调用。由于内存可以被设备直接访问,因此它可以以比malloc()等函数获得的可分页内存更高的带宽进行读写。分配过多的固定内存可能会降低系统性能,因为它会减少系统可用于分页的内存量。因此,最好谨慎使用此函数来分配暂存区域,以便在主机和设备之间进行数据交换。

    ...

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

    比较固定和非固定内存:https://www.cs.virginia.edu/~mwb7w/cuda_support/pinned_tradeoff.html“在固定和非固定内存之间选择”

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

    txbob 版主建议的 CUDA 论坛帖子:https://devtalk.nvidia.com/default/topic/899020/does-cudamemcpyasync-require-pinned-memory-/“cudaMemcpyAsync 是否需要固定内存?”

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2016-02-07
      • 2013-11-06
      • 2011-01-24
      • 1970-01-01
      • 2011-06-07
      • 2012-05-21
      相关资源
      最近更新 更多