页锁定内存的申请时间

各位好:
使用cudaMallocHost或者cudaHostAlloc申请40M的页锁定内存,物理内存8G,使用CUDA4.0需要耗时20秒,而是用CUDA5.5则仅需2秒,怎么差距那么大?

楼主开玩笑么?

(1)从3.2时代我就尝试使用page locked memory了,但从来没有在有几个GB空闲内存的情况下,只分配40MB就需要20s的。这是我的经验。
(2)网上从来没人抱怨分配40MB的page locked memory需要20秒的抱怨。(否则NV早就被掀翻了,这还能用么)
(3)唯一可能导致需要较长时间的分配是可能发生在这种情况下:
您要分配40MB的page locked memory, 但剩余的可用物理页面不足40MB, 此时虚拟内存&缓存子系统将尝试空出40MB的physical pages来,此时将可能引起一些pageable memory被交换出去,从而需要一定的时间。但是!交换40MB出去写到硬盘也不用20秒啊,哪怕对现在的普通硬盘来说。20秒都完全可以写上GB数据了。。。

楼主确定这不是幻觉么(调侃论坛将可能导致您的帖子被持续移动到灌水专区的)?
感谢来访,建议重新阅读上三段解释。

我也不相信,但这是反复测试的结果,是事实,使用cuda5.5后时间明显减少,目前没有测试其他版本的toolkit

我使用过3.0,3.1,3.2,4.0,4.1,4.2,5.0,5.5版本的toolkit, 均未发现此问题。
我身边的朋友有从0.8版本开始测试cuda的,也未发现此问题。

从常理来说,一个光分配40MB内存(硬件您有8GB内存), 就需要20秒的工具/库/平台,应该早就被市场抛弃了。

所以最大的可能是您测时部分有问题,而不能说CUDA本身有问题。

能否发下贵测时代码?谢谢。

clock_t ts = clock();
cudaMallocHost((void**)&pV, 20185088); //19M
printf(“AllocHost time:%f s\n”, (double)(clock()-ts)/CLOCKS_PER_SEC);
以上是测时的代码。
我今天实验了,使用CUDA4.2的toolkit和cuda5.5中的驱动程序,会出现这样的问题,显卡是GTX660 Ti,OS:WIN764bit,内存:8G

楼主您好,

(1)请不要使用clock进行测时,建议使用QueryPerformanceCounter();

(2)其次,我重复了您的试验, 安装了cuda 4.2并进行了对19MB的cudaMallocHost测时,并没有重现您的“分配一次需要20秒”的情况。

(3)之前说过,如果真的cuda的一个内存分配都要20秒,那么果断NV可以被骂死并关门了。但您知道现在并无这种情况发生(NV依然存在),所以您的现象不是个普遍存在的现象。

鉴于此,建议您:
(1)使用正确的测时方式,避免被测代码无问题,而测试者出问题。
(2)因为上文的(3)以及NV还存在的事实,请您检查是否您的特定机器有问题。

无法提供更多的建议了。

以及,考虑到一个事实是runtime api提供的cudaMallocHost是对driver api函数cuMemAllocHost的简单包装,而后者(cuMemAllocHost)只和显卡驱动有关(显卡驱动提供的nvcuda.dll)。

所以您在最新的驱动+无论4.2/5.0的runtime,都应该得到相同的性能。

但是您明确表明了,保持显卡驱动不变,换成4.2的runtime后,将极度缓慢到需要20s.
这严重不符合常理的。

您觉得呢?

LS好,我也觉得很难接受,但这是事实,而且在其他的相同配置的机器上也出现了这样的问题,另外使用QueryPerformanceCounter结果一样。
安装了最新的geforce驱动326.41,使用cuda5.5编译cudaMallocHost的时间是1s,cuda4.0编译cudaMallocHost的时间降低为6s。但在另外一台相同配置的机器上这样做后,使用cuda4.0编译cudaMallocHost的时间没有降低。
我这周就找这个问题了,重装了N遍系统。问题依旧,崩溃中。。。。

楼主我今日邀请了~10位有N卡的好友测试了此问题,但在4.0/4.2下均未能重现您的问题。

这10位N卡用户都在很短的时间内(连半秒都没的),就完成了40MB的分配。

我觉得到现在,应该只有2种可能:
(1)您的测试结果有问题。
(2)您的测试结果无问题,但是您报告的有问题(例如您试图使用您手中的西瓜诱惑我们)。

而不是cuda本身存在问题。真的。

编程环境是WIN7 64bit 专业版,我也测试CUDA4.0 SDK中的simplestream例程,确实分配40MB的页锁定内存非常快,大约0.01s。当把我的DLL(中有大量cuda代码)工程添加到simplestream,然后在simplestream中 调用dll的函数(包括cudaMallocHost),这时分配40MB的内存就会出现耗时特别长的问题,难道是我的DLL有问题?我下周在确认下,谢谢LS的回复。(顺便说一句,我没有诱惑你,我确实遇到了这样的问题)。

“然后在simplestream中 调用dll的函数(包括cudaMallocHost),这时分配40MB的内存就会出现耗时特别长的问题”
–楼主您真要测试,请将被测试对象单独抽出,隔离试验变量。。。(建议单独建立个项目测试)
–千万别测试的时候拽上7大姑8大姨妈的。。。
–你这样是多个因素在一起,不是cudaMallocHost的事,却屎盆子扣上去了。。。

谢谢LS的建议,如果仍然测试出有问题,我会贴上测试代码。

[attach]3344[/attach]

附件是我测试的工程,大体上说明下:
1,删除MYFFT/aaa.cu中的cufftPlan1d调用,cudaMallocHost速度大约是0.06s,增加cufftPlan1d调用,时间大约是2.6s
2,可以使用其他的即时方法,但结果都差不多,所以与计时方法关系不大。

我不想说什么了。。真的。

楼主大发阙词,严重批判NV:却是在参杂了多种因素后的“cudaMallocHost"测时。
cudaMallocHost真心无辜的说,您的批判毫无理由。

如同我曾经说过的,
”–楼主您真要测试,请将被测试对象单独抽出,隔离试验变量。。。(建议单独建立个项目测试)
–千万别测试的时候拽上7大姑8大姨妈的。。。
–你这样是多个因素在一起,不是cudaMallocHost的事,却屎盆子扣上去了。。“

本主题就保留不删除了,也希望楼主能反思我们这14楼层的对话。
也希望其他人能引以为戒。

首先我的代码也算是比较干净了,没有把“拽上7大姑8大姨妈的”。不知道我贴的代码测试了没有?如果测试了,能不能给出测试结果?我这边的现象是cudaMallocHost在cufftPlan1d调用存在的情况下耗时长,您能不能给出耗时长的原因?这个确实需要向您请教,谢谢!或者我的测试代码有问题,您都可以批评指正。

LZ您好:

既然您自己也表示直接cudaMallocHost()速度是正常的,有cufftPlan1D()存在的情况下速度才会变慢,那么一个自然的想法就是后者影响了前者。

考虑到cufftPlan1D()是初始化cufft对象的函数,其内部执行了对当前硬件的评估+内部缓冲区的申请+其他初始化工作。这些工作可能会影响您的cudaMallocHost()的实际执行时机,以至于您测量的时间并不仅仅是cudaMallocHost()的时间。

因此,建议您从您代码中其他部分对您的cudaMallocHost()执行以及计时的影响这个角度考虑。

祝您好运~

楼主您好,所有的测时一般均需要注意到避免runtime的初始化,对模块的载入,以及对模块中的kernel的jit时间。

您坠上个cufft,然后再测时的初次使用时间,这还不叫被无辜的姨妈们干扰么?

您可以单独测时cudaMallocHost,
或者您可以启动个空kernel后,再测时调用cudaMallocHost,
或者您可以测试从第二次起的cudaMallocHost,
但您不能在各种因素都存在的情况下,上去就测试cudaMallocHost.

感谢来访。

以及,一个不是提醒的提醒(我觉得你应该知道,但还是提醒一下):

如果您测试序列:
{
cufft*…;
cudaMallocHost();
}
的时间,那么它不叫cudaMallocHost的时间,而是总时间,这个我想您应该不会犯错。

如果之前没有犯这个错误(我认为您应该不会),请直接无视此提醒。