在Tegra TK1上使用malloc()与cudaHostAlloc()分配的数据的CPU内存访问延迟

时间:2015-01-15 20:35:00

标签: linux cuda nvidia tegra

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

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

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

1 个答案:

答案 0 :(得分:5)

我相信我找到了这种行为的原因。经过进一步调查(使用Linux trace events并查看nvmap driver code)后,我发现开销的来源是使用{{cudaHostAlloc()分配的数据标记为“不可缓存”的事实。 1}}标志。拨打NVMAP_HANDLE_UNCACHEABLE是为了确保相关的PTE标记为不可缓存。

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