我的 CUDA nvprof 'API Trace' 和 'GPU Trace' 不同步 - 怎么办?

My CUDA nvprof 'API Trace' and 'GPU Trace' are not synchronized - what to do?

我正在使用 CUDA 7.0 分析器 nvprof 来分析一些进行 CUDA 调用的进程:

$ nvprof -o out.nvprof /path/to/my/app

稍后,我生成两个跟踪:'API trace'(主机 CPU 上发生的情况,例如 CUDA 运行时调用和您标记的范围)和 'GPU trace'(内核执行,内存集、H2D、D2H 等):

$ nvprof -i out.nvprof --print-api-trace --csv 2>&1 | tail -n +2 > api-trace.csv
$ nvprof -i out.nvprof --print-gpu-trace --csv 2>&1 | tail -n +2 > gpu-trace.csv

每个跟踪中的每个记录都有一个时间戳(或开始和结束时间)。问题是,这两个跟踪中的时间值 0 是不一样的:GPU 跟踪 time-0 点似乎表示相关进程触发的 GPU 上的第一个操作开始执行的时间,而 API 跟踪的time-0 点似乎是流程执行的开始,或者大约在某个时候。

我还注意到,当我使用nvvp并导入out.nvprof时,值被更正了,也就是说,第一个GPU op的开始时间不是0,而是更现实的东西。

如何获得两条轨迹之间的正确偏移量?

the nvprof documentation 中可能不明显,但是在请求 nvprof 的输出时可以同时指定 --print-gpu-trace--print-api-trace,无论您是在分析一个应用程序或从先前捕获的探查器输出文件中提取信息。

如果您正在分析一个应用程序,下面应该为 API activity 和 GPU activity 生成一个 "harmonized" 时间线:

nvprof --print-gpu-trace --print-api-trace ./my_app

您可以使用 --log-file option 保存输出。

类似地,如果您要从先前捕获的输出文件中提取输出(与日志文件不同),您可以执行如下操作:

nvprof -i profiler_out_file --print-gpu-trace --print-api-trace ...

其中 profiler_out_file 应该是您之前使用 the nvprof -o ... option 保存的文件的名称。

为了使两条(合并的)时间线在同一时间点开始,使用同一命令打印两条轨迹至关重要;如果您发出两个命令,每个命令打印另一条轨迹,它们可能不是 'harmonized'.