[英]Timing Kernel launches in CUDA while using Thrust
CUDA中的内核启动通常是异步的,(据我所知)意味着一旦启动CUDA内核,控制就会立即返回到CPU。 除非使用cudaThreadsynchronize()
或cudaMemcpy()
强制停止CPU,否则CPU会在忙碌数字运算时继续执行一些有用的工作。
现在我刚开始使用Thrust库进行CUDA。 Thrust中的函数调用是同步还是异步?
换句话说,如果我调用thrust::sort(D.begin(),D.end());
其中D是设备矢量,使用测量排序时间是否有意义
start = clock();//Start
thrust::sort(D.begin(),D.end());
diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
std::cout << "\nDevice Time taken is: " <<diff<<std::endl;
如果函数调用是异步的,那么对于任何向量(对于时序都是垃圾),diff将为0秒,但如果它是同步的,我将确实获得实时性能。
调用内核的Thrust调用是异步的,就像推荐使用的底层CUDA API一样。 Thrust调用复制数据是同步的,就像底层的CUDA API推荐使用的那样。
所以你的例子只是测量内核启动和推力主机端设置开销,而不是操作本身。 对于计时,你可以通过在推力内核启动后调用cudaThreadSynchronize
或cudaDeviceSynchronize
(后者在CUDA 4.0或更高版本中)来解决这个问题。 或者,如果您包含后内核启动复制操作并在此之后记录停止时间,则您的时间将包括设置,执行和复制时间。
在你的例子中,这看起来像
start = clock();//Start
thrust::sort(D.begin(),D.end());
cudaThreadSynchronize(); // block until kernel is finished
diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
std::cout << "\nDevice Time taken is: " <<diff<<std::endl;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.