NVIDIA Nsight Systems性能分析工具

* 性能分析

  • NVIDIA Nsight Systems (推荐):

    这是 NVIDIA 官方推荐的更现代、功能更强大的分析工具。

    1. 安装 Nsight Systems

    2. 在 Docker 容器中启动程序:

      bash 复制代码
      # 确保你在启动容器时挂载了/usr/local/cuda/targets/x86_64-linux/lib/ 和 /usr/local/nvidia/lib64
      # 通常会映射到容器内部的相同路径
      # 例如:docker run --gpus all -it -v $(pwd):/app -w /app your_image bash
      
      # 在容器内部执行:
      ./video_blur -i data/input.mp4 -o data/output.mp4
    3. 在本机上启动 Nsight Systems GUI,然后选择 "Attach to process" 或 "Launch Application" (推荐)。
      如果你在宿主机上启动并选择 "Launch Application",可以直接指定 Docker 容器中的 video_blur 可执行文件。
      如果你的 Docker 运行在 SSH 远程主机上,Nsight Systems 也支持远程分析。

    4. 分析指标: 关注 CUDA 核函数执行时间、内存拷贝时间 (D2H, H2D)、CUDA 流的并发情况、CPU-GPU 同步点等。

1. 安装 Nsight Systems

在 Ubuntu 系统上安装 Nsight Systems(NVIDIA 的系统级性能分析工具)可以按照以下步骤进行:

步骤 1:确认系统要求

  • 操作系统:Ubuntu 16.04 及以上版本(64位)

  • 依赖:需要安装 libgtk-3-0 等基础库,可先执行以下命令安装依赖:

    bash 复制代码
    sudo apt update && sudo apt install -y libgtk-3-0 libasound2 libnss3 libxss1

步骤 2:本机下载 Nsight Systems

  1. 访问 NVIDIA 官方下载页面(需注册 NVIDIA 开发者账号,免费)
  2. 选择适合 Ubuntu 系统的版本(如 .deb 安装包,推荐)
    • 例如:nsight-systems-2023.3.1_2023.3.1.100_amd64.deb(版本号可能更新)

步骤 3:安装 Nsight Systems

  1. 执行 .deb 包安装命令:

    bash 复制代码
    sudo dpkg -i nsight-systems-<版本号>_amd64.deb
    • 若出现依赖错误,执行以下命令修复:

      bash 复制代码
      sudo apt -f install

步骤 4:验证安装:启动图形界面(可视化分析工具)

  1. 使用 nsys-ui 命令(而非 nsight-systems):
bash 复制代码
 nsys-ui
  1. 若成功启动图形界面,说明安装完成。(OPenGL版本低运行不起来。最在本机下载nsight-systems查看)
  2. Nsight Systems 还提供命令行工具 nsys,可直接在终端中使用:
bash 复制代码
# 查看版本
nsys --version

# 基本性能分析示例(分析一个可执行程序)
nsys profile ./main

步骤 5:分析指标: 关注 CUDA 核函数执行时间、内存拷贝时间 (D2H, H2D)、CUDA 流的并发情况、CPU-GPU 同步点等。

注意事项

  • 确保系统已安装匹配的 NVIDIA 驱动(推荐 450.51 及以上版本)

通过以上步骤,即可在 Ubuntu 系统上完成 Nsight Systems 的安装,用于分析 GPU/CPU 性能、追踪程序执行流程等场景。

步骤6:验证确认「程序是否真的调用了 GPU」

如果在 nsys-ui 中未看到 GPU 相关信息,需要执行:

bash 复制代码
# 基本性能分析示例(分析一个可执行程序)
nsys profile --trace cuda,osrt ./main

如果还没有,通常是 Profiling 阶段未正确追踪 CUDA/GPU 事件 ,或 程序本身未实际调用 GPU。可按以下步骤逐步排查,定位问题根源:

第一步:先确认「程序是否真的调用了 GPU」

首先排除「程序本身未使用 GPU」的情况(比如代码中 CUDA 逻辑未执行、设备选择错误等),这是最常见的基础问题。

验证方法:
  1. 运行程序时,用 nvidia-smi 实时监控 GPU 占用

    打开两个终端:

    • 终端 1:执行 watch -n 1 nvidia-smi(每秒刷新一次 GPU 状态),观察 GPU-Util(GPU 利用率)和 Processes(进程占用)列。
    • 终端 2:运行你的程序 ./main
    • GPU-Util 始终为 0%,且 Processes 中无 ./main 进程,说明 程序根本没调用 GPU ,此时 nsys 自然无法追踪到 GPU 事件。
  2. 检查程序代码中的 GPU 调用逻辑

    • 若为 CUDA 程序:确认是否有 cudaSetDevice(0)(指定设备)、cudaMalloc(内存分配)、kernel<<<...>>>(核函数调用)等核心逻辑,且无 cudaError_t 错误(建议在代码中添加错误检查,比如 cudaCheck(cudaGetLastError()))。
    • 若为 PyTorch/TensorFlow 等框架:确认是否设置了 device='cuda',且无 CPU-only 版本框架的误安装(比如 pip install torch 未带 CUDA 支持,需安装 torch==xx.xx.xx+cu121 这类带 CUDA 后缀的版本)。

第二步:若程序确实调用了 GPU,再检查「nsys Profiling 配置是否正确」

nvidia-smi 能看到程序占用 GPU,但 nsys 报告中无 GPU 信息,说明 Profiling 时未正确启用 CUDA 追踪,需重新检查命令参数。

常见配置问题及修复:
  1. 确认 Profiling 命令是否带了 --trace cuda 选项

    只有启用 --trace cudansys 才会追踪 GPU 相关事件(核函数、内存拷贝、流操作等)。

    • 错误命令(无 CUDA 追踪):nsys profile ./main(仅追踪 CPU,无 GPU 信息)。

    • 正确命令(强制启用 CUDA 追踪):

      bash 复制代码
      # 仅追踪 CUDA(GPU)事件
      nsys profile --trace cuda ./main
      # 推荐:同时追踪 CUDA + CPU(方便分析 CPU-GPU 同步)
      nsys profile --trace cuda,osrt --output=report_fillcrop.nsys-rep ./main

    重新执行上述正确命令,生成新的报告(如 report2.nsys-rep),再用 nsys-ui 打开查看。

  2. 检查 Profiling 时是否有「CUDA 追踪失败」的警告

    执行 nsys profile ./your_programe 命令时,注意终端输出是否有类似警告:

    • Warning: CUDA tracing is disabled because no CUDA devices were found.(未找到 CUDA 设备)
    • Warning: CUDA context creation failed.(CUDA 上下文创建失败)
      若有此类警告,说明 nsys 本身无法识别 GPU,需进一步检查 GPU 驱动和 CUDA 环境。

第三步:若仍无 GPU 信息,检查「GPU 驱动与 CUDA 环境是否正常」

nsys 依赖 NVIDIA 驱动和 CUDA 工具链来追踪 GPU 事件,环境异常会导致追踪失败。

环境检查步骤:
  1. 检查 NVIDIA 驱动版本

    执行 nvidia-smi,查看右上角的 Driver Version(需 ≥ 450.51,推荐 ≥ 525 版本,适配新 GPU)。

    • 若提示 command not found:驱动未安装或未加载,需重新安装匹配 GPU 型号的驱动(参考 NVIDIA 官网驱动下载)。
  2. 检查 CUDA Toolkit 是否安装且配置正确

    执行 nvcc -V(注意是大写 V),查看 CUDA 版本(需与驱动兼容,比如驱动 525 支持 CUDA 12.0~12.4)。

    • 若提示 command not found:未安装 CUDA Toolkit,或未配置环境变量。需安装后添加环境变量(如 .bashrc 中添加):

      bash 复制代码
      export PATH=/usr/local/cuda/bin:$PATH
      export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

      然后执行 source ~/.bashrc 生效。

  3. 验证 CUDA 环境是否可用

    编译并运行 CUDA 官方示例程序,确认基础 CUDA 功能正常:

    bash 复制代码
    # 进入 CUDA 示例目录(默认路径,若自定义安装需调整)
    cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    make  # 编译
    ./deviceQuery  # 运行设备查询
    • 若输出 Result = PASS:CUDA 环境正常;
    • 若输出 Result = FAIL:CUDA 环境异常(如驱动与 CUDA 版本不兼容、GPU 硬件问题),需先修复环境。

第四步:在 NVIDIA Nsight Systems 2025.5.1 中正确定位 GPU 相关信息

若上述步骤确认程序调用了 GPU、Profiling 命令正确、环境正常,可能是在 nsys-ui 中未找到正确的查看入口。

NVIDIA Nsight Systems 2025.5.1 查看 GPU 信息的核心入口:
  1. 打开报告后,进入「CUDA 视图」

    • 启动 NVIDIA Nsight Systems 并加载 report.nsys-rep 后,在左侧菜单栏找到 「CUDA」 相关选项(不同版本可能略有差异,常见标签如 CUDA KernelsCUDA MemoryCUDA Streams):
      • CUDA Kernels:查看所有 CUDA 核函数的执行时间、调用次数、占用设备(GPU 0/1)等(核心指标,若有数据说明 GPU 被调用)。
      • CUDA Memory:查看 H2D(主机到设备)、D2H(设备到主机)、D2D(设备内部)的内存拷贝时间和数据量。
      • CUDA Streams:查看不同 CUDA 流的并发情况,判断是否存在流阻塞。
  2. 通过「Timeline 视图」直观观察 CPU-GPU 并行

    • 在左侧菜单栏选择 「Timeline」 ,在上方工具栏勾选 「CUDA」「CPU」(确保两者都显示)。
    • 界面会显示时间轴:上方是 CPU 线程活动,下方是 GPU 活动(如 CUDA Kernel ExecutionCUDA Memory Copy)。
    • 若时间轴中无「GPU 活动」区域,或区域内无任何事件,说明仍未追踪到 GPU 数据,需回到前几步重新排查。

总结排查流程(按优先级排序)

  1. nvidia-smi 确认程序是否真的占用 GPU → 若否,修复程序代码;
  2. 确认 nsys profile 命令带了 --trace cuda → 若否,重新生成报告;
  3. 检查 nvidia-sminvcc -V 确认驱动/CUDA 正常 → 若异常,修复环境;
  4. nsys-ui 中通过「CUDA Kernels」或「Timeline」视图查找 GPU 事件。

按此流程操作后,通常能定位到「程序未调用 GPU」或「Profiling 配置错误」的核心问题,进而解决 nsys-ui 中无 GPU 信息的情况。

相关推荐
元Y亨H1 天前
华硕主机重装 Ubuntu 系统完全指南
ubuntu
字节逆旅3 天前
ubuntu应用深度守护
ubuntu
欧云服务器9 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
智渊AI9 天前
Ubuntu 20.04/22.04 下通过 NVM 安装 Node.js 22(LTS 稳定版)
ubuntu·node.js·vim
The️9 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
再战300年9 天前
Samba在ubuntu上安装部署
linux·运维·ubuntu
qwfys2009 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
木尧大兄弟9 天前
Ubuntu 系统安装 OpenClaw 并接入飞书记录
linux·ubuntu·飞书·openclaw
小虾爬滑丫爬9 天前
ubuntu上设置Tomcat 开机启动
ubuntu·tomcat·开机启动
老师用之于民9 天前
【DAY25】线程与进程通信:共享内存、同步机制及实现方案
linux·c语言·ubuntu·visual studio code