【问题标题】:How can I get a kernel's execution time with NSight Compute 2019 CLI?如何使用 NSight Compute 2019 CLI 获取内核的执行时间?
【发布时间】:2021-02-07 23:24:26
【问题描述】:

假设我有一个不需要命令行参数的可执行文件myapp,并启动一个CUDA 内核mykernel。我可以调用:

nv-nsight-cu-cli -k mykernel myapp

并得到如下所示的输出:

==PROF== Connected to process 30446 (/path/to/myapp)
==PROF== Profiling "mykernel": 0%....50%....100% - 13 passes
==PROF== Disconnected from process 1234
[1234] myapp@127.0.0.1
  mykernel(), 2020-Oct-25 01:23:45, Context 1, Stream 7
    Section: GPU Speed Of Light
    --------------------------------------------------------------------
    Memory Frequency                      cycle/nsecond      1.62
    SOL FB                                %                  1.58
    Elapsed Cycles                        cycle              4,421,067
    SM Frequency                          cycle/nsecond      1.43
    Memory [%]                            %                  61.76
    Duration                              msecond            3.07
    SOL L2                                %                  0.79
    SM Active Cycles                      cycle              4,390,420.69
    (etc. etc.)
    --------------------------------------------------------------------
    (etc. etc. - other sections here)

到目前为止 - 非常好。但现在,我只想要mykernel 的整体内核持续时间 - 而没有其他输出。看着nv-nsight-cu-cli --query-metrics,我明白了:

gpu__time_duration           incremental duration in nanoseconds; isolated measurement is same as gpu__time_active
gpu__time_active             total duration in nanoseconds 

那么,它一定是其中之一,对吧?但是当我跑步时

nv-nsight-cu-cli -k mykernel myapp --metrics gpu__time_duration,gpu__time_active

我明白了:

==PROF== Connected to process 30446 (/path/to/myapp)
==PROF== Profiling "mykernel": 0%....50%....100% - 13 passes
==PROF== Disconnected from process 12345
[12345] myapp@127.0.0.1
  mykernel(), 2020-Oct-25 12:34:56, Context 1, Stream 7
    Section: GPU Speed Of Light
    Section: Command line profiler metrics
    ---------------------------------------------------------------
    gpu__time_active                                   (!) n/a
    gpu__time_duration                                 (!) n/a
    ---------------------------------------------------------------

我的问题:

  • 为什么我得到“n/a”值?
  • 我怎样才能得到我所追求的实际值,而不是别的?

注意事项::

  • 我正在使用 CUDA 10.2 和 NSight Compute 版本 2019.5.0(内部版本 27346997)。
  • 我意识到我可以过滤不合格调用的标准输出流,但这不是我想要的。
  • 我实际上只想要原始数字,但我愿意接受使用 --csv 并采用最后一个字段。
  • nvprof transition guide 中找不到任何相关内容。

【问题讨论】:

  • @RobertCrovella 我想这个是给你的 :-)
  • 像这样的度量通常有一个限定符来定义测量中使用的算术类型。尝试询问gpu__time_active.max。在较新版本的 nsight 计算(例如 2020.2)中,还可以请求基本度量,即gpu__time_active,它会打印出它知道的所有度量变体:.max.avg.sum 等.但是我测试了2019.5.0版本并没有这样做;如果您没有给出完全合格的指标,它会打印n/a。我不知道如何获取实际值,除非您使用某种过滤方法,但您已声明不想要。
  • @RobertCrovella:我如何列出任意指标的所有变体?还是所有指标?
  • 一种可能的方法,根据我的测试:切换到更新版本的 nsight 计算,如果您要求gpu__time_active,它将为您提供所有可用变体的指标。我已经尽我所能回答了你的问题,你现在在这个问题上至少有 4 个。我无法在此进一步回复,这超出了 SO 期望 Q+A 网站正常工作的方式。关于你的最新问题,我也会参考这个:docs.nvidia.com/cupti/Cupti/…
  • @RobertCrovella:该死,没有方差,也没有标准偏差:-(

标签: cuda command-line-interface profiling nsight-compute


【解决方案1】:

tl;dr:您需要指定适当的“子度量”:

nv-nsight-cu-cli -k mykernel myapp --metrics gpu__time_active.avg

(基于@RobertCrovella 的 cmets)

CUDA 的分析机制收集“基本指标”,这些指标确实在--list-metrics 中列出。对于这些中的每一个,都采集了多个样本。在 NSight Compute 的 2019.5 版本中,您不能只获取原始样本;您只能获取“子度量”值。

“子度量”本质上是将样本序列聚合成一个标量值。不同的指标有不同种类的子指标(见this listing);对于gpu__time_active,它们是:.min.max.sum.avg。是的,如果您想知道 - 他们缺少像方差或样本标准差这样的第二时刻指标。

因此,您必须指定一个或多个子指标(参见上面的示例),或者升级到newer version of NSight Compute,您实际上可以显然只是获取所有样本。

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 2021-10-13
    • 2013-08-10
    • 2020-12-25
    • 2020-12-28
    • 2012-08-25
    • 2022-11-11
    • 2021-07-02
    • 2014-05-24
    相关资源
    最近更新 更多