CUDA中的内核启动通常是异步的,这意味着一旦启动了CUDA内核,控制立即返回到CPU(据我所知)。 CPU在GPU忙于数值计算时继续执行一些有用的工作,除非使用
现在我刚开始使用Thrust库进行CUDA编程。 Thrust中的函数调用是同步还是异步的?
换句话说,如果我调用
如果函数调用是异步的,那么对于任何向量diff将为0秒(这对于计时来说是无用的),但如果是同步的,我确实会得到真正的性能时间。
cudaThreadsynchronize()
或cudaMemcpy()
强制停止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秒(这对于计时来说是无用的),但如果是同步的,我确实会得到真正的性能时间。
clock
来计时推力持怀疑态度,因为它的分辨率很差。在过去,它并没有表现出色。你应该使用CUDA事件API代替。 - Jared Hoberock