请问要 用事件统计整个程序运行时间可以这样处理吗
程序第一行代码开始处:
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说的不错,都在文档里,为何不看呢?
感谢来访。