代码大致是这样:
// 事件统计时间
cudaEvent_t start;
cudaEvent_t stop;
cudaEventCreate(&start);
cudaEventCreate( &stop);
cudaEventRecord( start,0);
cudaEventSynchronize( start );
#pragma omp parallel for
for(int i = 0 ;i < n; i++)
{
....
for(j=0 ;j < k; j++)
kernle<<<>>>
}
//
cudaEventRecord( stop,0); cudaEventSynchronize( stop );
float time_used;
cudaEventElapsedTime( &time_used,start,stop );
这样使用event 是否正确统计了cpu 和 gpu 的总运行时间?
楼主您好,济南今日暴风雨+雷电! 抱歉给您回复晚了。
(1)您这样是可以正确统计2次record之间的host和device操作所占用的时间的。
(2)以及,如果您中途的部分没有使用non-blocking的streams, 您还应该可以将第一个cudaEventSynchronize()去掉。
(如果您使用了,请保留)。
感谢来访。
以及,如果第二点您使用了non-blocking的streams, 建议在第二个cudaEventRecord前加入cudaDeviceSynchronize().
(如果您正常使用,请忽视这点)。
[quote=“system”, post: 3, topic: 2874]
以及,如果第二点您使用了non-blocking的streams, 建议在第二个cudaEventRecord前加入cudaDeviceSynchron …
[/quote]感谢版主回复,今天忙别的事去了 ,抱歉没有来及时回复。
请问non-blocking streams是什么意思, 程序用的默认stream,是否是non-blocking stream
楼主您好,我也真心抱歉,昨日朋友来济南了,陪他外出了:
楼主您说的non-blocking stream是5.0的toolkit提供的新特性,
并针对1.0-3.5的所有计算能力卡提供:
您将使用cudaStreamCreateWithFlags(…, cudaStreamNonBlocking);
此时这样创建的流将不自动和默认流同步。
感谢来访。