栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

CUDA和固定(页面锁定)内存根本没有页面锁定?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CUDA和固定(页面锁定)内存根本没有页面锁定?

似乎在引擎盖下的CUDA
6.5上固定的分配器

mmap()
与MAP_FIXED一起使用。尽管我不是OS专家,但是这显然具有“固定”内存的作用,即确保其地址永远不变。但是,这不是一个完整的解释。请参阅@Jeff的答案,指出几乎可以肯定的是“缺失的部分”。

让我们考虑一个简短的测试程序:

#include <stdio.h>#define DSIZE (1048576*1024)int main(){  int *data;  cudaFree(0);  system("cat /proc/meminfo > out1.txt");  printf("*$*before allocn");  cudaHostAlloc(&data, DSIZE, cudaHostAllocDefault);  printf("*$*after allocn");  system("cat /proc/meminfo > out2.txt");  cudaFreeHost(data);  system("cat /proc/meminfo > out3.txt");  return 0;}

如果我们使用来运行该程序

strace
,并在
printf
语句之间摘录输出部分,那么我们将:

write(1, "*$*before allocn", 16*$*before alloc)       = 16mmap(0x204500000, 1073741824, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, 0, 0) = 0x204500000ioctl(11, 0xc0304627, 0x7fffcf72cce0)   = 0ioctl(3, 0xc0384657, 0x7fffcf72cd70)    = 0write(1, "*$*after allocn", 15*$*after alloc)        = 15

(请注意1073741824恰好是1 GB,即与请求的1048576 * 1024相同)

回顾描述的

mmap
,我们有:

地址为映射提供了首选的起始地址。NULL不表示首选项。该地址以前的所有映射都将自动删除。您提供的地址可能仍会更改,除非您使用MAP_FIXED标志。

因此,假设

mmap
命令成功执行,则请求的虚拟地址将被固定,这可能是有用的,但并不是全部。

正如我提到的,我不是OS专家,对我来说,这个系统调用究竟会创建一个“固定”映射/分配,这对我来说并不明显。可能是

MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS
某种方式的组合创建了固定的基础分配,但是我还没有找到任何证据来支持这一点。

根据本文,偶数

mlock()
页面似乎无法满足DMA活动的需求,这是CUDA中固定主机页面的主要目标之一。因此,似乎其他方式正在提供实际的“固定”功能(即,保证基础物理页面始终位于内存中,并且它们的虚拟到物理映射不会更改-
后面的内容可能是
MAP_FIXED
与任何机制一起完成,都可以确保基础物理页面不会以任何方式移动)。

该机制显然不使用

mlock()
,因此之前和之后的锁页面都不会更改。但是,我们期望映射统计信息会发生变化,并且如果将上述程序生成的out1.txt和out2.txt进行比较,我们将看到(摘录):

< Mapped: 87488 kB---> Mapped:          1135904 kB

差异约为1 GB,即请求的“固定”内存量。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390795.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号