同样的cudaMalloc操作,profile出来时间差别巨大?

在一个CUDA程序中,用cudaMalloc申请了如下几个内存,用profiler测试时间的时候,第一个cudaMalloc用了139ms,后面5个cudaMalloc分别只用了100us左右的时间,这是为什么?
代码如下:(其中nmax=20000)
checkCudaErrors( cudaMalloc( (void**) &dxx, sizeof(float)(nmax+1)));
checkCudaErrors( cudaMalloc( (void**) &dxy, sizeof(float)
(nmax+1)));
checkCudaErrors( cudaMalloc( (void**) &dxz, sizeof(float)(nmax+1)));
checkCudaErrors( cudaMalloc( (void**) &dxxs, sizeof(float)
(1)));
checkCudaErrors( cudaMalloc( (void**) &dxys, sizeof(float)(1)));
checkCudaErrors( cudaMalloc( (void**) &dxzs, sizeof(float)
(1)));

LZ您好:

第一个cudaMalloc()伴随有一些初始化工作,所以较慢,请以后面的为准。

祝您好运~

第一次的任何调用都很慢的,

因为需要Runtime初始化。

这个是固定开销,不能避免。
请无视这点击可。

好的,谢谢两位!
还有问题,我用profiler测试出来的kernel运行时间是700ms左右,比在程序中上用计时函数计算出来的时间(3s多),少了三四倍左右,这是为什么?

LZ您好:

请以profiler为准。

祝您好运~

楼主您好,

任何你手工的非profiler结果,都请以profiler为准。

论坛对此问题讨论过不下100次了,这个结论是准确可信了。

请采纳此结论。谢谢。

感谢来访。

好的。
再请教个问题,profiler中的timeline只到kernel结束,就停止了,而kernel后面的cudaMemcpy和cudaFree都没有了,请问要怎么做才能把后面的步骤也放到profiler中分析?

楼主您好:

默认总是都包含的,而不是您这样,kernel后就没了。

请您检查是否您在kernel后面手工加了cudaDeviceReset()之类的语句,
如果有,请移动到main的最后。

谢谢。

[attach]3459[/attach][attach]3458[/attach][attach]3457[/attach]

我确定代码里没有加入强制关闭内核的语句,您可以看看我三个截图,Tesla C2050显卡的session是1.025s,cudaGreensFunctionH的end也到1.025s,cudaGreensFunctionH是我的kernel,结束后profiler就不显示了。

这奇怪了,

请问楼主kernel后的几个cudaMemcpy都执行了么?
(是否出错?)

谢谢。

以及,如果方便,请在main的最后面加上cudaDeviceReset()以看有无改善。

(如果已经添加,请无视本文)

都执行了。最终结果是正确的。

如果都执行了,且正确的执行了,而且你最后也有cudaDeviceReset(),

但是profiler的时间线却选择性的少了一些。那我不知道为什么了。

加入cudaDeviceReset()后,问题解决了,谢谢各位!

感谢楼主的配合。

楼主是善于接受建议、具有巨大进步潜力的人物。

感谢来访,并期待您的下次莅临。

多谢夸奖,感觉这个论坛几位版主很热心,而且技术超凡。受益匪浅!

LZ您好:

感谢您的鼓励,愿与您一起建设我大cudazone论坛!