关于用事件统计时间的问题

请问要 用事件统计整个程序运行时间可以这样处理吗
程序第一行代码开始处:
cudaEvent_t start;
cudaEvent_t stop;
cudaEventCreate( &start);
cudaEventCreate( &stop);
cudaEventRecord(start);

// c++ 代码


c函数(调用了kernel)

程序结束处:
cudaEventRecord( stop,0);
cudaEventSynchronize(stop);
float time_cost;
cudaEventElapsedTime(&time_cost, start,stop );

这个应该只能统计kernel所使用的时间

例子是
cudaEventRecord(start);

Sleep(1000);
kernel函数

cudaEventRecord( stop,0);
cudaEventSynchronize(stop);
float time_cost;
cudaEventElapsedTime(&time_cost, start,stop );

此处的Sleep(1000)并没有被统计进去:)

此处不正确,应该是同步的问题,导致host代码的运行时间没有实际被两个记录所记录下来。详细见楼下斑竹的解答

试了下这个例子 ,确实如此

        cudaEventCreate( &start);
   cudaEventCreate( &stop);
   cudaEventRecord( start );
   Sleep(1000);
   cudaEventRecord( stop,0);
   float time;
   cudaEventElapsedTime( &time,start,stop );
   printf("time=%f\n",time);

输出结果:time=-107374176.000000
看来time没有被计算。

event是用来统计2个event被实际record之间所经历的时间。

所以,认真起来,你的Sleep(1000); 也会被统计的。您看看如下代码:
cudaEventRecord( start , 0 );
cudaEventSynchronize(start); (或者你用cudaDeviceSynchronize)

Sleep(1000);

cudaEventRecord( stop,0);

cudaEventSynchronize(stop); (或者你用cudaDeviceSynchronize)

float time;
cudaEventElapsedTime( &time,start,stop );
如上,只要您确保您的host代码所经历的时间是在2个event的实际record之间的,那么也可以被计时的。

(某些会员的回答不是会正确,但是精神可嘉!望再接再厉!)

加了cudaEventSynchronize(start) 和 cudaEventSynchronize(stop) 之后,确实统计了sleep(1000)的时间。
但我不明白 cudaEventSynchronize() 或 cudaDeviceSynchronize()到底是什么意思,请斑竹解释下,谢谢~

LZ您好:

这两个函数请您查阅一下CUDA Toolkit自带的文档(如programming guide和Toolkit Reference Manual)以获得官方的基本解释。

祝您好运~

首先说,cudaEventElapsedTime是衡量的是2次record之间的时间差。

但是,cudaEventRecord只是在一个流里发布了record一个event的命令,但这个record并不一定就是现在完成的。

而您在您的Sleep(1000)前后,加入了cudaEventSynchronize(), 这会导致此Sleep(1000)是的确在2次record完成时刻之间执行的,从而可以被测量。

其实ICE说的不错,都在文档里,为何不看呢?
感谢来访。