【问题标题】:Cuda reusing events to determine execution time of multiple sectionsCuda 重用事件来确定多个部分的执行时间
【发布时间】:2016-03-04 12:25:45
【问题描述】:

我希望计算我的 cuda 代码的两个不同部分的执行时间。为此,我尝试使用 CudaEvent_t 启动、停止。 我的问题是,我可以使用相同的两个事件“开始”和“停止”来计算其他部分的执行时间吗?

例如:

cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);

// SECTION 1
cudaEventRecord(start, 0);
cudaMemcpy(..., ..., ..., cudaMemcpyHostToDevice);
cudaEventRecord(stop, 0);

cudaEventSynchronize(stop);
cudaEventElapsedTime(&executionTime, start, stop);
printf("SECTION 1 executionTime: %f", executionTime);
// SECTION 1

// SECTION 2
cudaEventRecord(start, 0);    // Reusing start event
cudaMemcpy(..., ..., ..., cudaMemcpyDeviceToHost);
cudaEventRecord(stop, 0);     // Reusing stop event

cudaEventSynchronize(stop);
cudaEventElapsedTime(&executionTime, start, stop);
printf("SECTION 2 executionTime: %f", executionTime);
// SECTION 2

这段代码能否准确估计第 1 节和第 2 节的执行时间因为我正在尝试恢复 cudaEvent_t 启动,也可以为第 2 节停止?还是我需要为第二部分创建两个额外的事件 start1 和 stop1?

【问题讨论】:

    标签: c cuda parallel-processing gpu gpgpu


    【解决方案1】:

    您可以重复使用事件。您可以record an event more than once

    如果cudaEventRecord() 之前已在事件中调用过,则此调用将覆盖事件中的任何现有状态。任何检查事件状态的后续调用将仅检查对 cudaEventRecord() 的最近调用的完成情况。

    因此,这意味着使用事件测量的任何时间都将仅适用于最近记录的事件。在您的案例/示例中,这基本上是不言而喻的,但在更复杂的情况下,应该注意只有最近记录的事件“版本”才是“活动的”。

    【讨论】:

    • 感谢您的回复,但我还有一个疑问。在第 1 节和第 2 节中记录停止事件后,我使用了 cudeEventSynchronize(stop)。在这种情况下,是否有必要对这两个部分都这样做,还是仅在第 2 节中调用该函数就足够了?
    • 在典型用法中,两个部分都需要。 cudaEventSynchronize() 是主机线程的执行屏障。它强制线程等待,直到 CUDA 运行时(即 GPU)遇到有问题的事件。如果 CUDA 运行时尚未遇到一个或两个指示的事件,cudaEventElapsedTimereturn an error。请参阅我链接的文档部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多