zoukankan      html  css  js  c++  java
  • CUDA程序计时

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

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

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

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

    然后记录起始时间:

    cudaEventRecord(start, 0);

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

    cudaEventRecord(stop, 0);

    由于核函数被调用后,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, 0);
    
    // 在GPU上执行一些工作
    
    cudaEventRecord(stop, 0);
    cudaEventSynchronize(stop);
    float elapsedTime;
    cudaEventElapsedTime(&elapsedTime, start, stop);


    注意:

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

  • 相关阅读:
    GeoServer 发布矢量切片服务
    GeoServer 服务 端口修改
    Python 启动 FastAPI 报错 Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
    conda和pip的常用语句
    ArcGIS Pro 图层数据批量执行多部件转单部件
    ArcGIS Pro 中文(简体)语言包-指定路径为空
    2020 Ateneo de Manila University DISCS PrO HS Division
    N皇后问题-汇编解法
    HDU
    HDU
  • 原文地址:https://www.cnblogs.com/dukeleo/p/3387561.html
Copyright © 2011-2022 走看看