两个kernel之间的间隔长达90us,啥情况

两个kernel之间的间隔长达90us,其实两个kernel之间的CPU运算最多十几us,

从profile测试图上看出,kernel执行120us,结束后3us执行cudaMemcpyAsync,cudaMemcpyAsync执行时间2us左右,然后就是近90us左右的空白,其实测试kernel之间cpu执行的代码时间只有十几us啊

1)这么长的时间干啥去了啊,大家遇到过类似问题吗,大概是什么原因,该怎么解决啊
2)如果我使用多stream来分别执行,kernel是否能很好的对GPU资源进行时分复用呢,从而达到GPU被一直喂饱的状态
3)GPU的事件除了用来计时外,是否可以用来在kernel内部给CPU发信号(类似中断),如果可以发信号我就不需要GPU和CPU来回拷数据了,我的程序性能将大大提升

大致结构是这样的,如果需要的话我可以上全代码,不过全代码看着可能有点眼花。。。
__int64 time1,time2;
cudaMemcpyAsync(d_pData , pData,sizeof(char)dataLength,cudaMemcpyHostToDevice);
for(i=0 to n)
{
time1 = get_cpu_tick();
cpuFunctin1();
time2 = get_cpu_tick();
printf(“2 time %f us\n”,(time2-time1)/(2.5
100010001000)10001000);

cudaMemcpyAsync(d_correlator, pCorr,sizeof(STRUCT)*12,cudaMemcpyHostToDevice);
corrKernel_BBS<<<grid,block>>>(d_pData ,d_correlator);
cudaMemcpyAsync(pCorr,d_correlator,sizeof(STRUCT)*12,cudaMemcpyDeviceToHost);

time1 = get_cpu_tick();
cpuFunctin2();
time2 = get_cpu_tick();
printf(“2 time %f us\n”,(time2-time1)/(2.510001000*1000)10001000);
}

多谢版主大人能帮我分析!!

LZ您好:

1:您的GPU执行回合-CPU进行处理判断–GPU下一个执行回合,会导致2个回合之间出现无可避免的空当的,建议您如下修正:
连续对GPU发布多个处理回合,最后一次性同步,CPU再处理结果,效果较好。

2:使用多stream应该能有所改善。

3:event不能实现这个用法的。

大致如上,祝您编码顺利~