之前写的CUDA程序,想测量一下性能,网上很多用的是CPU端计时,很不准确。翻了一下书,发现这里应该使用事件来计时。

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

首先创建两个事件,起始时间和结束时间:

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

然后记录起始时间:

cudaEventRecord(start, );

然后执行GPU端代码,执行完毕记录结束时间:

cudaEventRecord(stop, );

由于核函数被调用后,GPU执行完之前,CPU会继续执行程序中的下一行代码,因此此时记录的时间不准确,应该把这条语句放入GPU的未完成工作队列中,使得直到GPU执行完了的调用cudaEventRecord()之前的所有语句时,事件才会被记录下来。修复这个问题只需要在下面加一行代码:

cudaEventSynchronize(stop);

记录完毕后,计算总耗时:

float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop);

这里得到的elapsedTime就是执行GPU端代码所需时间,单位ms。

总流程为:

cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, ); // 在GPU上执行一些工作 cudaEventRecord(stop, );
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop);

注意:

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

最新文章

  1. Android混合开发之WebView使用总结
  2. UVaLive 7143 Room Assignment (组合数+DP)
  3. POJ3273 Monthly Expense
  4. ymPrompt消息组件
  5. (一)win7下cocos2d-x 21 + vs2010
  6. java web 学习十五(jsp基础语法)
  7. Windows 2008 server R2安装.NET Framework4时提示“灾难性故障”解决
  8. 常用SNS开源系统比较
  9. C程序设计语言练习题1-3
  10. JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内
  11. java中synchronized的使用
  12. Harris角点检测原理分析
  13. ORACLE 多表关联 UPDATE 语句
  14. Hibernate学习(八)———— Hibernate检索策略(类级别,关联级别,批量检索)详解
  15. 学习mongoDB的一些感受(转自:http://blog.csdn.net/liusong0605/article/details/11581019)
  16. 【iCore4 双核心板_ARM】例程三十:U_DISK_IAP_FPGA实验——更新升级FPGA
  17. python中时间、日期、时间戳的转换
  18. 单例&多线程
  19. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
  20. GCD 中使用 dispatch group 进行同步操作

热门文章

  1. 【前端_js】JavaScript知识点总结
  2. 【php】【异步】php实现异步的几种方法
  3. POJ - 2250 Compromise (LCS打印序列)
  4. golang(go语言)调试和查看gc信息,以及gc信息解析
  5. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study
  6. 使用Blend的一些问题和技巧
  7. 下拉列表 Spinner
  8. Linux的档案权限与目录配置练习题
  9. python学习-- Django传递数据给JS
  10. 1章 perl入门