CUDA程序设计

请教:
自己编写的 CUDA核函数,是异步执行的,即 调用后,立即返回 host端。但如果在核函数之后,调用函数
cudaDeviceSynchronize(),则要等 device端 的核函数执行完成之后才返回到 host端。那么:
(1) 是否可以根据这一点,由 clock() 函数来测量核函数的运行时间?命令如下:
clock_t time_Kernel = 0;
time_Kernel -= clock;
Kernel<<<,>>>();
cudaDeviceSynchronize();
time_Kernel += clock;

(2) 是否可以根据这一点,缩短整个程序的运行时间?如:
程序一:
Kernel<<<,>>>(); // CUDA核函数
function(); // host端运行的函数
cudaDeviceSynchronize();

程序二:
Kernel<<<,>>>(); // CUDA核函数
cudaDeviceSynchronize();
function(); // host端运行的函数

假设 Kernel 和 function 的运行时间相等,则 程序二 的运行时间是 程序一 的两倍,是否正确?

谢谢!:slight_smile:

楼主您好,

关于您的问题:

(1)这样做是不可以的。因为clock()不具有跨平台性,同时可能具有一定的测量精度误差。
但您的思路是正确且非常值得赞扬的!
您可以在您的思路的基础上,考虑改用QueryPerformanceCounter()之类的函数来测量时间的。

(2)这个依然是个非常值得赞扬的思路。楼主的确用心了。
这样做是可以的,并且是推荐做的,这样尽量让GPU和CPU同时执行各自的代码。能缩短时间。

(3)如2所述,您的思路是正确的。这里的例子如果kernel和function都是20ms, 则一共需要40ms. 而您通过变换cudaDeviceSynchronize(),让总时间缩短到了20ms左右。的确是个不错的。

希望您再接再厉!

谢谢版主,这些都是书上看到的,就是不太确定!:lol
另外,关于(1):可否利用clock()函数测量整个程序的运行时间?(对精度没有太高的要求,只是用来计算加速比),程序如下:
clock_t time_Kernel = 0;
time_Kernel -= clock;

// host端代码

Kernel<<<,>>>();
cudaDeviceSynchronize();

// host端代码

time_Kernel += clock;

楼主您好:

我之前为您指出,任何情况下均不建议在host code里使用clock()来测试某段代码的时间。
因为除了精确性的问题,它还存在巨大的跨平台性问题。甚至在某些平台下完全不可用。

所以建议您:
(1)在Windows上使用GetPerformanceCounter()/Frequency()
(2)在Linux上使用gettimeofday()

希望您能深刻思索这点。
感谢您的夜晚来访。

嗯,明白了不具有跨平台性的意思,谢谢版主,非常感谢您的耐心解答!

您客气了,服务您是我的荣幸。

感谢您的深夜来访。

有版主们的不辞辛劳,我们的编程才更顺利些:handshake