微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我的问题是:从主机访问cudaHostAlloc'd数据的开销从哪里来的? 数据映射到/ dev / nvmap在cpucaching上未caching?

是否有可能在Windows机器上编译Linux的CUDA C代码

没有检测到支持CUDA的设备

为什么我的c程序突然使用了30g的虚拟内存?

TensorFlow:libcudart.so.7.5:无法打开共享对象文件:没有这样的文件或目录

限制对Cuda和OpenCL资源的访问

设备内存空间中的cuda程序内核代码

ImportError:libcudart.so.7.0:无法打开共享对象文件:没有这样的文件或目录

使用LLVM / Clang在Win10上使用OpenMP的Cuda

CUDA 5.0:replace为cutil.h?

在Ubuntu 12.10中安装cuda 5样本

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

主机访问使用cudamallocManaged()分配的数据的行为是不同的。 数据将被缓存(使用标志NVMAP_HANDLE_CACHEABLE )。 因此从主机访问这个数据就相当于malloc()'d数据。 同样重要的是,CUDA运行时不允许设备(GPU)与主机同时访问与cudamallocManaged()一起分配的任何数据,并且这样的操作会生成错误。 但是,运行时允许同时访问设备和主机上的cudaHostAlloc()'d数据,我相信这是使cudaHostAlloc()'d数据无法缓存的原因之一。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐