说我想计时从设备全局内存中获取内存
cudaMemcpy(...cudaMemcpyHostToDevice);
cudaThreadSynchronize();
time1 ...
kernel_call();
cudaThreadSynchronize();
time2 ...
cudaMemcpy(...cudaMemcpyDeviceToHost);
cudaThreadSynchronize();
time3 ...
我不明白为什么我的time3和time2总能给出相同的结果。我的内核确实需要很长时间才能获取结果,但是在kernel_call完成之前,cudaThreadSynchronize()是否应该阻止所有操作?从设备存储器取出到主机存储器也需要一段时间,至少是显而易见的。谢谢。
答案 0 :(得分:3)
监视执行时间的最佳方法是使用CUDA_PROFILE_LOG = 1 环境变量,并在CUDA_PROFILE_CONFIG文件中设置值, timestamp,gpustarttimestamp,gpuendtimestamp。在使用这些环境变量运行cuda程序之后,应创建一个本地.cuda_log文件,并在memcopies和内核执行的时间量内列入微秒级别。干净而非侵入性
答案 1 :(得分:1)
我不知道这是否是关键点,但我注意到以下几点:
如果你看一下nvidia代码样本(不知道究竟在哪里),你会发现类似“预热”函数的东西,在调用一些应该被测量的关键内核之前调用它。
为什么?
因为每次执行程序时,nvidia驱动程序都会动态优化在第一次访问期间(在你的case1之前的情况下)驱动gpu的艺术。会有很多开销。这对我来说已经很久没有了。当我做了10次跑步时,第一次跑步是太懒了。现在我知道为什么了。
解决方案:只需使用虚拟/预热功能,即在真正执行代码之前访问gpu硬件。