如何使用 NSight Compute 2019 CLI 获取内核的执行时间?
How can I get a kernel's execution time with NSight Compute 2019 CLI?
假设我有一个不需要命令行参数的可执行文件 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 中找不到任何相关内容。
tl;dr: 您需要指定合适的 'submetric':
nv-nsight-cu-cli -k mykernel myapp --metrics gpu__time_active.avg
(基于@RobertCrovella 的评论)
CUDA 的分析机制收集 'base metrics',它们确实与 --list-metrics
一起列出。对于其中的每一个,都采集了多个样本。在 NSight Compute 的 2019.5 版本中,您不能只获取原始样本;您只能获得 'submetric' 个值。
'Submetrics' 本质上是将样本序列聚合成标量值。不同的指标有不同种类的子指标(参见 this listing);对于 gpu__time_active
,它们是:.min
、.max
、.sum
、.avg
。是的,如果您想知道 - 他们缺少 second-moment 指标,例如方差或样本标准差。
因此,您必须指定一个或多个子指标(参见上面的示例),或者升级到 newer version of NSight Compute,实际上您 可以 显然所有样本。
假设我有一个不需要命令行参数的可执行文件 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 中找不到任何相关内容。
tl;dr: 您需要指定合适的 'submetric':
nv-nsight-cu-cli -k mykernel myapp --metrics gpu__time_active.avg
(基于@RobertCrovella 的评论)
CUDA 的分析机制收集 'base metrics',它们确实与 --list-metrics
一起列出。对于其中的每一个,都采集了多个样本。在 NSight Compute 的 2019.5 版本中,您不能只获取原始样本;您只能获得 'submetric' 个值。
'Submetrics' 本质上是将样本序列聚合成标量值。不同的指标有不同种类的子指标(参见 this listing);对于 gpu__time_active
,它们是:.min
、.max
、.sum
、.avg
。是的,如果您想知道 - 他们缺少 second-moment 指标,例如方差或样本标准差。
因此,您必须指定一个或多个子指标(参见上面的示例),或者升级到 newer version of NSight Compute,实际上您 可以 显然所有样本。