CUDA(Ⅶ):使用事件(event)来测量性能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24990189/article/details/89602618

目录

背景提出:

CUDA Event API:

如何实现?:cudaEvent_t、cudaEventCreate、cudaEventRecord

存在的问题及解决方法。cudaEventSynchronize、cudaEventElapsedTime、cudaEventDestroy

注意事项:

小结:


背景提出:

如何判断Constant Memory对程序性能的影响?即哪个版本的执行时间更短?我们不用CPU或者OS中的某个计时器的原因:

(1)各种延迟:OS线程调度、高精度CPU计时器可用性等方面

(2)GPU的Kernel运行时,我们还可以在主机上异步执行计算。

故测量Host运算时间的唯一方式是使用CPU或者OS的定时机制。为了测量GPU在某个任务上花费的时间,我们使用CUDA的事件API。

CUDA Event API:

如何实现?:cudaEvent_t、cudaEventCreate、cudaEventRecord

本质是一个GPU时间戳,这个时间戳是在用户指定的时间点上记录的。由于GPU本身支持记录时间戳,因此就避免了当使用CPU定时器来统计GPU执行时间时可能遇到的诸多问题。

//创建一个事件,然后记录一个事件
cudaEvent_t     start, stop;
cudaEventCreate( &start );
cudaEventCreate( &stop ) ;
cudaEventRecord( start, 0 ) ;

//在GPU上执行一些工作
cudaEventRecord( stop, 0 ) ;

存在的问题及解决方法。cudaEventSynchronize、cudaEventElapsedTime、cudaEventDestroy

在使用事件时,最复杂的情况是当我们在CUDA C中执行的某些异步函数调用时。例如,当启动光线跟踪器的Kernel时,GPU开始执行代码,但在GPU执行完之前,CPU会继续执行程序中的下一行代码。从性能角度,这意味着我们可以在GPU和CPU上同时进行计算,但从逻辑观念上来看,这将使计时工作变得复杂。

cudaEventRecord()视为一条记录当前时间的语句,并且把这条语句放入GPU的未完成队列中。因为直到GPU执行完了在调用cudaEventRecord()之前的所有语句时,事件才会被记录下来。且仅当GPU完成了之前的工作并且记录了stop事件后,才能安全地读取stop时间值。

直到GPU执行到stop事件,当cudaEventSynchronize返回时,我们知道在stop事件之前的所有GPU工作已经完成了,因此可以安全地读取在stop中保存的时间戳。

cudaEvent_t     start, stop;
cudaEventCreate( &start );
cudaEventCreate( &stop ) ;
cudaEventRecord( start, 0 ) ;

//在GPU上执行的一些操作

cudaEventRecord( stop, 0 ) ;
//很幸运,有一种事件API函数,告诉CPU在某个事件上同步
cudaEventSynchronize( stop );

float   elapsedTime;
cudaEventElapsedTime( &elapsedTime,start, stop ) );
printf( "Time to generate:  %3.1f ms\n", elapsedTime );

cudaEventDestroy( start );
cudaEventDestroy( stop );

注意事项:

CUDA事件是直接在GPU上实现的,因此它们不适用于对同时包含设备代码和主机代码的混合代码计时。也就是说,如果你试图通过CUDA事件对Kernel和设备内存复制之外的代码进行计时,将得到不可靠的结果。

工具函数,用来计算两个事件之间经历的时间,第一个参数为某个浮点变量的地址,在这个参数中将包含两次事件之间经历的时间,单位是毫秒。

cudaEventElapsedTime( &elapsedTime,start, stop ) );

小结:

在某些情况下,使用Constant Memory将提升应用程序的性能。特别是,当Warp中的所有Thread都访问相同的只读数据时,将获得额外的性能提升。在这种数据访问模式汇总使用Constant Memory可以节约内存带宽,不仅是因为这种模式可以将读取操作早Half-Warp中广播,而且还应为在芯片上包含了Constan Memory常量内存缓存。

在很多算法中,内存带宽都是一种瓶颈,因此采用一些机制来改善这种情况是非常有用的

如何通过CUDA时间在GPU执行过程的特定时刻上记录时间戳,如何将CPU与GPU在某个事件上同步,以及如何计算在两个事件之间经历的时间。

猜你喜欢

转载自blog.csdn.net/qq_24990189/article/details/89602618