繁体   English   中英

Timing Kernel在使用Thrust时在CUDA中启动

[英]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推荐使用的那样。

所以你的例子只是测量内核启动和推力主机端设置开销,而不是操作本身。 对于计时,你可以通过在推力内核启动后调用cudaThreadSynchronizecudaDeviceSynchronize (后者在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM