2

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

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

非常感谢

4

1 回答 1

2

根据我的实验,它肯定会捕获某种开销。

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

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

当然,在我看来,上面描述的时间显然必须捕获 cudaMemcpy 1 和内核调用之间的 CPU 开销(以及不是由于内核本身造成的各种其他时间贡献。)

所以不太明显的情况是当内核单独或被其他异步调用包围时:

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似乎很明显主机线程将被阻塞至少在cudaEvent系统捕获的时间startstop标记之间,因此我认为在这种情况下没有理由不参考它作为 CPU 开销。

于 2013-10-20T00:59:38.167 回答