内核内的CUDA评测

内核内的CUDA评测,cuda,nvvp,Cuda,Nvvp,是否有配置CUDA内核的选项?不是作为一个整体,而是它的一部分。我有一些设备函数调用,我想测量它们的时间。是否有任何标志/事件/指令可以设置,然后在NVIDIA Visual Profiler中可见?或者我是否需要通过插入cudaEventCreate和类似函数手动执行此操作。您可以使用clock()或clock64()函数手动为内核的特定部分计时: unsigned long long* time_spent; __global__ void kernel(...) { unsign

是否有配置CUDA内核的选项?不是作为一个整体,而是它的一部分。我有一些设备函数调用,我想测量它们的时间。是否有任何标志/事件/指令可以设置,然后在NVIDIA Visual Profiler中可见?或者我是否需要通过插入
cudaEventCreate
和类似函数手动执行此操作。

您可以使用
clock()
clock64()
函数手动为内核的特定部分计时:

unsigned long long* time_spent;

__global__ void kernel(...)
{
    unsigned int t1, t2;
    // ...
    t1 = clock();
    // code of interest
    t2 = clock();
    atomicAdd(&time_spent, t2 - t1);
}
'clock()`正式返回一个时钟,但我更喜欢显式使用unsigned int来说明上述代码如何正确处理时钟值的换行(只要计时代码不超过2^32-1个周期即可完成)

确保代码的时间也与

    t1 = clock();
    t2 = clock();

背对背,这样就可以减去计时开销。

不是因为
clock()
为每个SM返回一个本地计数器吗?答案是:是的。但这并不重要,只要我们只从同一个SM获取时间差。(动态并行性确实会在这里产生一个问题,为了简单起见,我刚刚假设感兴趣的代码不会启动任何其他内核)。