gpt4 book ai didi

c - 使用 Thrust 时在 CUDA 中启动计时内核

转载 作者:行者123 更新时间:2023-12-05 01:30:01 30 4
gpt4 key购买 nike

CUDA 中的内核启动通常是异步的,这(据我了解)意味着一旦 CUDA 内核启动,控制权立即返回给 CPU。当 GPU 忙于数字运算时,CPU 继续做一些有用的工作除非使用 cudaThreadsynchronize()cudaMemcpy() 强制停止 CPU。

现在我刚刚开始使用 Thrust CUDA 库。是 Thrust 中的函数调用吗同步还是异步?

换句话说,如果我调用 thrust::sort(D.begin(),D.end()); 其中 D 是设备 vector ,那么测量排序是否有意义使用时间

        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;

如果函数调用是异步的,那么任何 vector 的 diff 都将为 0 秒(这对于计时来说是垃圾),但如果它是同步的,我确实会获得实时性能。

最佳答案

调用内核的 Thrust 调用是异步的,就像 thrust 使用的底层 CUDA API 一样。复制数据的推力调用是同步的,就像推力使用的底层 CUDA API 一样。

因此您的示例将仅测量内核启动和推力主机端设置开销,而不是操作本身。对于计时,您可以通过在 thrust 内核启动后调用 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;

关于c - 使用 Thrust 时在 CUDA 中启动计时内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8091219/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com