加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在Tegra TK1上使用malloc()与cudaHostAlloc()分配的数

发布时间:2020-12-14 01:02:06 所属栏目:Linux 来源:网络整理
导读:我正在执行一个简单的测试,它比较了使用malloc()分配的数据的访问延迟和使用cudaHostAlloc()从主机分配的数据(cpu正在执行访问). 我注意到访问使用cudaHostAlloc()分配的数据比访问Jetson Tk1上的malloc()分配的数据要慢得多. 这不是离散GPU的情况,似乎只适
我正在执行一个简单的测试,它比较了使用malloc()分配的数据的访问延迟和使用cudaHostAlloc()从主机分配的数据(cpu正在执行访问).
我注意到访问使用cudaHostAlloc()分配的数据比访问Jetson Tk1上的malloc()分配的数据要慢得多.

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

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读