【问题标题】:CUDA: cudaEvent_t and cudaThreadSynchronize usageCUDA:cudaEvent_t 和 cudaThreadSynchronize 用法
【发布时间】:2011-04-27 17:22:53
【问题描述】:

我对@9​​87654321@ 的用法有点困惑。目前,我正在使用这样的clock() 调用来查找内核调用的持续时间:

cudaThreadSynchronize();
clock_t begin = clock();

fooKernel<<< x, y >>>( z, w );

cudaThreadSynchronize();
clock_t end = clock();

// Print time difference: ( end - begin )

寻找更高分辨率的计时器我正在考虑使用cudaEvent_t。在我使用cudaEventRecord() 记下时间之前,我是否需要致电cudaThreadSynchronize(),或者是否多余?

我问的原因是因为还有另一个电话cudaEventSynchronize(),似乎要等到事件记录下来。如果录制延迟,计算出来的时间差是不是会在内核执行完毕后显示一些额外的时间?

【问题讨论】:

    标签: timer cuda


    【解决方案1】:

    其实还有更多的同步功能(cudaStreamSynchronize)。编程指南详细描述了每一个的作用。使用事件作为计时器基本上可以归结为:

    //create events
    cudaEvent_t event1, event2;
    cudaEventCreate(&event1);
    cudaEventCreate(&event2);
    
    //record events around kernel launch
    cudaEventRecord(event1, 0); //where 0 is the default stream
    kernel<<<grid,block>>>(...); //also using the default stream
    cudaEventRecord(event2, 0);
    
    //synchronize
    cudaEventSynchronize(event1); //optional
    cudaEventSynchronize(event2); //wait for the event to be executed!
    
    //calculate time
    float dt_ms;
    cudaEventElapsedTime(&dt_ms, event1, event2);
    

    event2 上进行同步很重要,因为您要确保在计算时间之前执行所有操作。由于事件和内核都在同一个流上(保留顺序)event1kernel 也被执行。

    您可以改用cudaStreamSynchronize 甚至cudaThreadSynchronize,但在这种情况下两者都过分了。

    【讨论】:

    • LumpN:为什么没有在调用 cudaEventRecord 时立即记录事件?如果没有记录在该调用中,它如何表示该内核所花费的时间?
    • @Ashwin:当事件到达流的顶部时记录该事件,这就像一个 FIFO。当您调用 cudaEventRecord 时,您正在将事件推送到流中。如果在事件之前的流中有工作,则该事件在流 FIFO 中未处理,直到它前面的每个操作都完成为止。所有这些调用对于调用主机线程都是异步的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多