我正在执行一个简单的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] 举报,一经查实,本站将立刻删除。