CudaEvent内核启动的时机

时间:2013-10-15 18:48:37

标签: cuda profiling

我试图解释我使用CudaEvents做的一些时间,通过CudaEvents定时内核执行是否还包括内核启动的开销时间?

不幸的是,我无法再访问Cuda兼容的GPU来进行任何测试。

非常感谢

1 个答案:

答案 0 :(得分:2)

根据我的实验,它肯定会捕获一些类型的开销。

我认为应该很清楚,如果内核被其他同步活动括起来,那么必须包含CPU开销,因为CPU开销将先前的活动与内核启动分开:

cudaEventRecord(start);
cudaMemcpy(...);         // cudaMemcpy 1
my_kernel<<<...>>>(...);
cudaMemcpy(...);
cudaEventRecord(stop);

当然,对我来说,上面描述的时间必须捕获cudaMemcpy 1和内核调用之间的CPU开销(以及不是由内核本身引起的各种其他时间贡献)。“ p>

所以不太明显的情况是内核单独或被其他异步调用括起来的时候:

cudaEventRecord(start);
my_kernel<<<...>>>(...);
cudaEventRecord(stop);
cudaEventSynchronize(stop);

基于我对上述模式的测试,以及一个空内核:

__global__ void my_kernel(){
  }

我在linux上观察至少几微秒的时间,这比在我的空内核中执行两条指令所需的时间要长得多:

            Function : _Z8mykernelv
    /*0000*/     /*0x00005de428004404*/     MOV R1, c [0x1] [0x100];
    /*0008*/     /*0x00001de780000000*/     EXIT;

因此,我声称cudaEvent系统正在捕获某种执行设置开销。如果有人想声称这个开销是 CPU开销,而是其他东西,那就这样吧。

我的主张是捕获了某种形式的开销,我认为没有理由不将其称为CPU开销。此外,典型cudaEvent时序包括紧跟cudaEventSynchronize()标记后的stop,似乎很明显主机线程将至少被{{1}捕获的持续时间阻止cudaEventstart标记之间的系统,因此我认为在这种情况下没有理由不将其称为CPU开销。