【问题标题】:How to make comparable timemeasurement in cuda and c++ code如何在 cuda 和 C++ 代码中进行可比较的时间测量
【发布时间】:2016-11-14 22:23:43
【问题描述】:

我有相同算法的 cuda 和 cpp 实现。在 CUDA 中,我使用事件进行时间测量:

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

cudaEventRecord(start, 0);      // start time measurement

//  some cuda stuff

cudaEventRecord(stop, 0);       // stop time measurement
cudaEventSynchronize(stop);     // sync results
cudaEventElapsedTime(&time, start, stop);
printf ("Elapsed time : %f ms\n", time);

在 c++ 中,我使用 timeofday 进行测量:

struct timeval start, end;
long  seconds, useconds; 
float mseconds;
gettimeofday(&start, NULL);

// some work to do

gettimeofday(&end, NULL);

seconds  = end.tv_sec  - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
mseconds = (seconds * 1000 + useconds/1000.0) + 0.5;
printf ("Elapsed time : %f ms\n", mseconds);

这是获得良好可比结果的正确方法吗?

提前致谢!

【问题讨论】:

  • 如果这对您来说足够好,那么为了比较就可以了(查看您的毫秒精度,无需关心较长的运行时间)。如果您想要 C++ 标准方式、C++11 及更高版本的内容,请参阅std::chrono - steady_clock 长时间(避免在此过程中调整系统日期)或high_resolution_clock as-good-a-precision-as -your-C++-standard-lib-and-OS-can-provide.

标签: c++ cuda


【解决方案1】:

是的,这是比较 CPU 与 GPU 时间的好方法。

当然,有多种方法可以获得 CPU 计时,从高分辨率系统计时器到 __rdtsc 内部函数。但是对于这样一个粗略的比较,两者都应该可以正常工作。

如果您想深入了解您的 GPU 性能并寻找潜在的改进领域,您可能需要查看命令行 CUDA 分析器nvprofVisual Profiler,它们的作用相同,但还有一个图形用户界面。

【讨论】:

    【解决方案2】:

    如果您只是想比较与 CUDA 相关的东西的整个执行时间,您可以保留 C++ 时间测量值。只需确保您的设备在检查已用时间之前已完成每一项任务即可:

    gettimeofday(&start, NULL);
    
    // some work to do
    cudaDeviceSynchronize();
    
    gettimeofday(&end, NULL);
    

    这是一种简单的方法来计算您的任务在使用 CUDA 的设备端与 CPU 端相比所花费的时间。

    正如 ApoorvaJ 所建议的,如果您需要更深入地了解 CUDA 性能以检查设备瓶颈在哪里,您可以使用 Visual Profiler。如果您使用的是 Visual Studio,请查看 these steps 我为另一个想要检查 PTX 代码的 SO 用户写的。您只需要探索 Visual Profiler 可以提供的其他数据,而且还有很多! 查看 Nvidia 官方 CUDA 文档中的Profiler section

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 2022-07-05
      • 1970-01-01
      • 2012-06-19
      • 2022-01-03
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多