我试图解释我使用CudaEvents做的一些时间,通过CudaEvents定时内核执行是否还包括内核启动的开销时间?
不幸的是,我无法再访问Cuda兼容的GPU来进行任何测试。
非常感谢
答案 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}捕获的持续时间阻止cudaEvent
和start
标记之间的系统,因此我认为在这种情况下没有理由不将其称为CPU开销。