8

我熟悉使用 nvprof 访问基准的事件和指标,例如,

nvprof --system-profiling on --print-gpu-trace -o (file name) --events inst_issued1 ./benchmarkname

system-profiling on --print-gpu-trace -o (filename)    

命令给出开始时间、内核结束时间、电源、温度的时间戳,并将信息保存在 nvvp 文件中,以便我们可以在可视化分析器中查看它。这使我们能够看到代码的任何部分发生了什么,特别是在特定内核运行时。我的问题是——

有没有办法隔离仅在基准运行的一部分中计数的事件,例如在内核执行期间?在上面的命令中,

--events inst_issued1    

只是给出整个可执行文件的指令。谢谢!

4

2 回答 2

17

您可能需要阅读探查器文档

您可以在可执行文件中打开和关闭分析。用于此的 cuda 运行时 API 是:

cudaProfilerStart() 
cudaProfilerStop() 

因此,如果您只想收集特定内核的配置文件信息,您可以这样做:

#include <cuda_profiler_api.h>
...

cudaProfilerStart();
myKernel<<<...>>>(...);
cudaProfilerStop();

并摘自文档:

在使用启动和停止功能时,您还需要指示分析工具在应用程序启动时禁用分析。对于 nvprof,您可以使用 --profile-from-start off 标志执行此操作。对于 Visual Profiler,您可以在 Settings View 中使用 Start execution with profiling enabled 复选框。

同样从文档nvprof,您可以使用命令行开关将事件/指标列表限制为单个内核:

 --kernels <kernel name>

该文档提供了额外的使用可能性。

于 2015-09-17T17:22:06.627 回答
0

在对此进行了更多研究之后,事实证明,还为所有内核(不使用--kernels并专门指定它们)提供了内核级别信息,方法是使用

nvprof --events <event names> --metrics <metric names> ./<cuda benchmark>   

事实上,它给出了形式的输出

“设备”、“内核”、“调用”、“事件名称”、“最小”、“最大”、“平均”

如果在基准测试中多次调用内核,这允许您查看这些内核运行所需事件的 Min、Max、Avg。显然--kernels,Cuda 7.5 Profiler 上的选项允许指定每个内核的每次运行。

于 2015-09-21T18:47:28.577 回答