看了有的代码,统计gpu运算时间:1.是放在kernel函数中(如深入浅出cuda编程),比较复杂,
2.而有的是放在kernel函数外,就是起始时间计算放在kernel调用前,结束时间计算放在kernel调用后,
我认为2这种方式最简单,但不确定是否是统计了gpu 真正的运算时间,请大神解答下统计GPU运算时间最简单最有效的方式
LZ您好:
推荐使用event来测试kernel执行的时间,详情请参阅Programming Guide。
或者您如果不想写代码的话,跑一下profiler就有kernel的运行时间了。
祝您好运~
cudaEvent_t start, stop;
cudaEventCreate (&start);
cudaEventCreate (&stop);
cudaEventRecord(start, 0);
kernel function<<<xxxx>>>xxx
cudaThreadSynchronize();
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime_g, start, stop); // 計算時間差
printf("Global memory processing time: %f (ms)\n", elapsedTime_g);
这样写可以吗,另外您指的”跑一下profiler “是什么意思
楼主您好,
使用clock()之类的在kernel中,无法真正的测试出一个kernel的运行时间的。
因为clock()返回的计数值有2个问题:
1)是这个是每个线程(实际上是warp)独立获取的,如果想要求出最小值和最大值来确定整体运行时间,无可避免的需要使用global memory上的atomicMin/Max, 这将会带来严重干扰的。
2)是clock()的时钟值是每个SM独立的(也就是每个SM不是同一个时刻从0开始计时的,例如他们不是同一个时间启用的),如果一个block中在多个SM上暂停运行-进行迁移-恢复运行(这个有可能的),那么两次clock()的差将变得毫无意义。
因为(1)(2), 所以不建议使用任何第三方书籍中的计时方式。
其二,什么方式计时最简单?
一个是用profiler, 直接运行跑一下即可,会看图的人就能轻松看到运行时间。
二个则是ice在 2#推荐的方式: 建立2个cudaEvent_t变量,然后等待对此2个event的record完成,用EventElapsedTime()求出时间差即可。简单方便。(手册有例子,可以参考可)。
感谢您的周末来访。
这样写显然不行的,您额外引入了一次cudaDeviceSynchronize(), 这将会导致无辜的host<->device通讯多次,实际测得的时间会增大的。
请改成:
cudaEventRecord(start, 0);
kernel function<<>>xxx
cudaEventRecord(stop, 0);
然后等待对2个event的record完成:
cudaEventSynchronize(stop); (或者cudaDeviceSynchronize()
cudaEventElapsedTime(…);
还是不明白profiler,这是一个工具吗,还是Nsight里带的
楼主您好,
profiler全程是NVIDIA Visual Profiler, 您可以点击您屏幕右下角的开始按钮,然后输入profiler, 然后将自动查找,然后将启动。
对profiler的使用,请看前天的ice帖子,里面非常详细。
或者自行阅读profiler自带的教程,
或者自行上网搜索如何使用。
无法对您手把手的教学此程序。
我看到有的用timer统计,这种方式可以吗
unsigned int timer=0;
cutCreateTimer(&timer);
cutStartTimer(timer);
{
//统计的代码段
(这里面可以放kernel函数吗?)
…………
}
//停止计时
cutStopTimer(timer);
//获得从开始计时到停止之间的时间
cutGetTimerValue( timer);
//删除timer值
cutDeleteTimer( timer);
您可以看到我只推荐了2种方式,一个是event, 一个是profiler.
我不懂您的这第三种方式。无法评价。
明白,谢谢~