如何测量 NVIDIA nsight 系统中复制的数据量?

How to measure the amount of data copied in NVIDIA nsight systems?

知识问答

在 NVIDIA Nsight Systems 中,您可以使用 --stats=true 标志来获取 GPU 和 CPU 之间数据传输的详细信息。输出包括类似于以下内容的部分:

CUDA Memory Operation Statistics (KiB)

              Total      Operations              Average            Minimum              Maximum  Name                                                                            
-------------------  --------------  -------------------  -----------------  -------------------  -------------------
           8192.000               2             4096.000           4096.000             4096.000  [CUDA memcpy HtoD]                                                              
         528384.000               2           264192.000           4096.000           524288.000  [CUDA memcpy DtoD] 

问题

是否可以在每次 API 调用时获取此统计信息?也就是说,我们可以在每个 cudaMemCpyxxx 调用中获取 Host/Device 之间传输的数据量吗?

如果您想纯粹从 CLI 执行此操作,我建议按照 this blog 中从“扩展摘要统计信息”开始的指导进行操作。基本步骤是将配置文件数据导出为 sqlite 数据库,然后制定数据库查询以提取所需数据。我承认这不是一个完整的食谱。

如果可以接受使用 GUI,我认为它非常简单。假设我们有一个非常简单的 CUDA 程序:

int main(){

        int *d1, *d2;
        int *h1, *h2;
        h1 = new int[8192];
        h2 = new int[262144];
        cudaMalloc(&d1, 32768);
        cudaMalloc(&d2, 1048576);
        cudaMemcpy(d1, h1, 32768, cudaMemcpyHostToDevice);
        cudaMemcpy(d2, h2, 1048576, cudaMemcpyHostToDevice);
}

这些是步骤:

  1. 您可以直接从 GUI 进行交互式分析,如 here 所述,也可以从 CLI 开始。要从 CLI 开始,运行 像这样的命令:

    nsys profile --trace=cuda ./my_app
    

    在其他活动中,这将创建一个名为 reportX.qdrep 的报告文件,其中 X 实际上是一个数字,例如 1、2、3 等。

  2. 打开GUI,然后File...打开上面的reportX.qdrep文件。在这种情况下,GUI 不需要在同一台机器上,但它的版本应该大于或等于用于创建报告文件的 CLI 版本。

  3. 完全展开时间线中与 CUDA 活动有关的所有行

  4. 将鼠标悬停在感兴趣的操作上: