5

我正在执行一个简单的测试,比较使用 malloc() 分配的数据和使用 cudaHostAlloc() 从主机分配的数据的访问延迟(cpu 正在执行访问)。我注意到在 Jetson Tk1 上访问用 cudaHostAlloc() 分配的数据比访问用 malloc() 分配的数据要慢得多。

这不是独立 GPU 的情况,似乎只适用于 TK1。经过一番调查,我发现使用 cudaHostAlloc() 分配的数据被内存映射 (mmap) 到进程地址空间的 /dev/nvmap 区域。对于映射在进程堆上的正常 malloc 数据,情况并非如此。我知道这种映射可能是允许 GPU 访问数据所必需的,因为 cudaHostAlloc 的数据必须从主机和设备都可见。

我的问题如下:从主机访问 cudaHostAlloc 数据的开销来自哪里?映射到 /dev/nvmap 的数据是否未在 CPU 缓存中缓存?

4

1 回答 1

6

我相信我已经找到了这种行为的原因。经过进一步调查(使用Linux 跟踪事件并查看nvmap 驱动程序代码),我发现开销的来源来自cudaHostAlloc()使用标志标记为“不可缓存”的数据分配的事实NVMAP_HANDLE_UNCACHEABLE。调用 以pgprot_noncached()确保相关的 PTE 被标记为不可缓存。

主机访问使用分配的数据的行为cudaMallocManaged()是不同的。数据将被缓存(使用标志NVMAP_HANDLE_CACHEABLE)。因此,从主机访问该数据就相当于访问malloc()'d数据。同样重要的是要注意,CUDA 运行时不允许设备 (GPU) 访问cudaMallocManaged()与主机同时分配的任何数据,这样的操作会产生段错误。然而,运行时允许同时访问设备和主机上的数据,我相信这是使数据不可缓存cudaHostAlloc()'d的原因之一。cudaHostAlloc()'d

于 2015-01-20T00:31:32.180 回答