0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CUDA强大新工具:nvprof 命令行探查器

星星科技指导员 来源:NVIDIA 作者:Mark Harris 2022-04-11 09:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

CUDA 5 为 CUDA 工具箱添加了一个强大的新工具: nvprofnvprof 是一个可用于 Linux 、 Windows 和 OS X 的命令行探查器。乍一看, nvprof 似乎只是 NVIDIA Visual Profiler 和 NSight 日蚀版 中图形分析功能的无 GUI 版本。但是 nvprof 远不止这些;对我来说, nvprof 是一个轻量级的分析器,它达到了其他工具所不能达到的水平。

使用 nvprof 进行快速检查

我经常想知道我的 CUDA 应用程序是否按预期运行。有时这只是一个正常的检查:应用程序是否在 GPU 上运行内核?它是否执行过多的内存复制?通过使用 nvprof ./myApp 运行我的应用程序,我可以快速看到它所使用的所有内核和内存副本的摘要,如下面的示例输出所示。

    ==9261== Profiling application: ./tHogbomCleanHemi

    ==9261== Profiling result:

    Time(%)      Time     Calls       Avg       Min       Max  Name

     58.73%  737.97ms      1000  737.97us  424.77us  1.1405ms  subtractPSFLoop_kernel(float const *, int, float*, int, int, int, int, int, int, int, float, float)

     38.39%  482.31ms      1001  481.83us  475.74us  492.16us  findPeakLoop_kernel(MaxCandidate*, float const *, int)

      1.87%  23.450ms         2  11.725ms  11.721ms  11.728ms  [CUDA memcpy HtoD]

      1.01%  12.715ms      1002  12.689us  2.1760us  10.502ms  [CUDA memcpy DtoH]

在默认的 摘要模式 中, nvprof 提供了应用程序中 GPU 内核和内存副本的概述。摘要将对同一内核的所有调用组合在一起,显示每个内核的总时间和总应用程序时间的百分比。除了摘要模式之外, nvprof 还支持 GPU – 跟踪和 API 跟踪模式 ,它可以让您看到所有内核启动和内存副本的完整列表,在 API 跟踪模式下,还可以看到所有 CUDA API 调用的完整列表。

下面是一个使用 nvprof --print-gpu-trace 评测在我的电脑上的两个 GPUs 上运行的 nbody 示例应用程序的示例。我们可以看到每个内核在哪个 GPU 上运行,以及每次启动使用的网格维度。当您想验证 multi- GPU 应用程序是否按预期运行时,这非常有用。

nvprof --print-gpu-trace ./nbody --benchmark -numdevices=2 -i=1

...

==4125== Profiling application: ./nbody --benchmark -numdevices=2 -i=1

==4125== Profiling result:

   Start  Duration            Grid Size      Block Size     Regs*    SSMem*    DSMem*      Size  Throughput           Device   Context    Stream  Name

260.78ms     864ns                    -               -         -         -         -        4B  4.6296MB/s   Tesla K20c (0)         2         2  [CUDA memcpy HtoD]

260.79ms     960ns                    -               -         -         -         -        4B  4.1667MB/s  GeForce GTX 680         1         2  [CUDA memcpy HtoD]

260.93ms     896ns                    -               -         -         -         -        4B  4.4643MB/s   Tesla K20c (0)         2         2  [CUDA memcpy HtoD]

260.94ms     672ns                    -               -         -         -         -        4B  5.9524MB/s  GeForce GTX 680         1         2  [CUDA memcpy HtoD]

268.03ms  1.3120us                    -               -         -         -         -        8B  6.0976MB/s   Tesla K20c (0)         2         2  [CUDA memcpy HtoD]

268.04ms     928ns                    -               -         -         -         -        8B  8.6207MB/s  GeForce GTX 680         1         2  [CUDA memcpy HtoD]

268.19ms     864ns                    -               -         -         -         -        8B  9.2593MB/s   Tesla K20c (0)         2         2  [CUDA memcpy HtoD]

268.19ms     800ns                    -               -         -         -         -        8B  10.000MB/s  GeForce GTX 680         1         2  [CUDA memcpy HtoD]

274.59ms  2.2887ms             (52 1 1)       (256 1 1)        36        0B  4.0960KB         -           -   Tesla K20c (0)         2         2  void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [242]

274.67ms  981.47us             (32 1 1)       (256 1 1)        36        0B  4.0960KB         -           -  GeForce GTX 680         1         2  void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [257]

276.94ms  2.3146ms             (52 1 1)       (256 1 1)        36        0B  4.0960KB         -           -   Tesla K20c (0)         2         2  void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [275]

276.99ms  979.36us             (32 1 1)       (256 1 1)        36        0B  4.0960KB         -           -  GeForce GTX 680         1         2  void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [290]



Regs: Number of registers used per CUDA thread.

SSMem: Static shared memory allocated per CUDA block.

DSMem: Dynamic shared memory allocated per CUDA block.

使用nvprofto ProfileAnything

nvprof 知道如何评测运行在 GPUs NVIDIA 上的 CUDA 内核,不管它们是用什么语言编写的(只要它们是使用 CUDA 运行时 API 或驱动程序 API 启动的)。这意味着我可以使用 nvprof 来评测 OpenACC 程序(没有显式内核),甚至可以在内部生成 PTX 汇编内核的程序。 Mark Ebersole 在他最近关于 CUDA Python 的 CUDA Cast ( 第十集 )中展示了一个很好的例子,其中他使用 NumbaPro 编译器(来自 Continuum Analytics )及时编译了一个 Python 函数,并在 GPU 上并行运行。

在 OpenACC 或 CUDA Python 程序的初始实现过程中,函数是否在 nvprof 或 GPU 上运行可能并不明显(尤其是如果您没有计时)。在 Mark 的例子中,他在 GPU 内部运行 Python 解释器,捕捉应用程序的 CUDA 函数调用和内核启动的跟踪,显示内核确实在 GPU 上运行,以及用于将数据从 CPU 传输到 GPU 的 cudaMemcpy 调用。这是一个很好的例子,说明了像 nvprof 这样的轻量级命令行 GPU 探查器的“健全性检查”功能。

使用nvprof进行远程分析

有时,您正在部署的系统不是您的桌面系统。例如,如果您使用的是 GPU 集群或云系统,如 Amazon EC2 ,并且您只能通过终端访问机器。这是 nvprof 的另一个重要用途。只需连接到远程计算机(例如使用 ssh ,并在 nvprof 下运行应用程序。

通过使用 --output-profile 命令行选项,您可以输出一个数据文件,以便以后导入到 nvprof 或 NVIDIA 可视化探查器中。这意味着您可以在远程计算机上捕获一个概要文件,然后在可视化分析器中可视化并分析桌面上的结果(有关详细信息,请参见“ 远程分析 ”)。

nvprof 提供了一个方便的选项( --analysis-metrics ),用于捕获 visualprofiler 在其“引导分析”模式下所需的所有 GPU 指标。下面的屏幕截图显示了用于确定内核瓶颈的可视化分析器。此分析的数据是使用下面的命令行捕获的。

nvprof --analysis-metrics -o  nbody-analysis.nvprof ./nbody --benchmark -numdevices=2 -i=1
分析从 nvp 命令行分析器导入的数据的 NVIDIA 可视化分析器( nvp )的屏幕截图。

非常方便的工具

如果您是命令行工具的粉丝,我想您会喜欢使用 nvprof 。 nvprof 可以做的还有很多,我在这里还没有提到,比如在 NVIDIA 可视化分析器中收集分析指标。关于作者

Mark Harris 是 NVIDIA 杰出的工程师,致力于 RAPIDS 。 Mark 拥有超过 20 年的 GPUs 软件开发经验,从图形和游戏到基于物理的模拟,到并行算法和高性能计算。当他还是北卡罗来纳大学的博士生时,他意识到了一种新生的趋势,并为此创造了一个名字: GPGPU (图形处理单元上的通用计算)。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5334

    浏览量

    136235
  • Linux
    +关注

    关注

    88

    文章

    11865

    浏览量

    219882
  • WINDOWS
    +关注

    关注

    4

    文章

    3711

    浏览量

    94465
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux运维工程师必备的30个高频命令

    生产环境中,Linux 命令行是运维工程师最常用的工具。很多时候,故障排查的第一步就是登录服务命令,而不是打开监控面板。监控能告诉你什么时候出了问题,但定位根因往往需要你手动执行一
    的头像 发表于 05-25 11:00 357次阅读

    Vector PC-lint Plus工具支持可视化配置分析

    PC-lint Plus的核心分析引擎以命令行方式运行,专注于高效的静态代码测试。为提升用户体验与团队协作效率,Vector为其配套提供了两款可视化工具:PC-lint Plus
    的头像 发表于 05-18 14:25 254次阅读
    Vector PC-lint Plus<b class='flag-5'>工具</b>支持可视化配置分析

    详解SSH服务的安全配置方法

    SSH(Secure Shell)是 Linux 系统远程管理的首选协议,几乎所有服务的远程管理都依赖 SSH。从简单的命令行登录到文件传输(SFTP)、端口转发、远程命令执行,SSH 是运维工程师每天都要使用的核心
    的头像 发表于 05-06 11:16 413次阅读

    ROC rk3588s PC的uboot命令行的启动

    到了 Ubuntu 启动流程。根据您的 Wiki 指导,我曾尝试在启动时通过串口终端反复按下 Ctrl+C、空格等按键,但始终无法进入 U-Boot 命令行。我怀疑是 U-Boot 环境变量中的 bootdelay
    发表于 04-06 21:40

    涂鸦CLI正式开源:让AI Agent一行命令管理3000+品类智能设备

    最近,CLI(命令行工具)正在成为AIAgent时代的基础设施。飞书、企业微信、钉钉等多家主流办公协作平台,相继开源了各自的CLI工具,将消息、文档、日程等产品能力封装为命令行接口,供
    的头像 发表于 04-02 18:10 482次阅读
    涂鸦CLI正式开源:让AI Agent一行<b class='flag-5'>命令</b>管理3000+品类智能设备

    运维工程师必须掌握的10个系统命令

    系统命令是运维工程师与服务交互的基础工具。虽然现代运维工作有大量的自动化工具和平台,但掌握核心系统命令仍然必要。
    的头像 发表于 03-23 10:28 368次阅读

    Kubernetes kubectl命令行工具详解

    kubectl是Kubernetes官方提供的命令行工具,作为与Kubernetes集群交互的主要接口,它通过调用Kubernetes API Server实现对集群资源的全面管理。在生产环境中,运维工程师需要熟练掌握kubectl命令
    的头像 发表于 02-02 16:40 698次阅读

    AI智能体工具及其配置介绍

    AI智能体(Agent)能够操控你的编程环境工具,简化了你对集成环境的操作。而最近的命令行界面(CLI)智能体,从操作系统命令行获得更多系统权限,进一步简化了你编程的操作,甚至可以帮助你整理文件
    的头像 发表于 12-30 10:49 1047次阅读
    AI智能体<b class='flag-5'>工具</b>及其配置介绍

    命令行阿里千问搭建过程

    克隆千问仓库,安装依赖; 下载模型权重; 命令行执行启动脚本,配置参数后运行推理。
    发表于 12-24 10:35

    【飞凌T527N开发板试用】CAN的使用

    端 can1:用命令行发送 先使能can1,然后设置发送长度。 执行 cangen就可以开始发送,在接收端就收到了数据。 反之can0,qt应用发送, can1,命令行接受 测试demo学习 命令行
    发表于 08-19 17:27

    如何进行tflite模型量化

    在windows上,如果我们按照上一期的方式安装了tflite2pb,是不能直接运行的。因为命令行工具是为linux编译的。
    的头像 发表于 08-13 11:45 1876次阅读
    如何进行tflite模型量化

    所见即所得——Luban-Lite VS Code插件让开发实现“命令行自由”

    NEWS所见即所得!Luban-LiteVSCode插件指南亲爱的开发者朋友们,你是否还在为嵌入式开发中频繁切换命令行而抓狂?配置环境参数如“走迷宫”,编译烧录还需切换AiBurn?今天,匠芯创为您
    的头像 发表于 08-07 15:38 1309次阅读
    所见即所得——Luban-Lite VS Code插件让开发实现“<b class='flag-5'>命令行</b>自由”

    解析K8S实用命令

    前言: 作为运维工程师,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文将深入解析 K8S 最实用的命令,从基础操作到高级技巧,助你成为容器化集群管理专家。
    的头像 发表于 07-24 14:07 1110次阅读

    USB串行配置实用程序是否有可用的命令行版本?

    USB串行配置实用程序是否有可用的命令行版本?
    发表于 07-22 08:09

    浅谈wsl --update` 命令行选项无效的解决方案

    PS C:\Users\Administrator> wsl --update >> 命令行选项无效: --update
    的头像 发表于 06-27 10:28 1.2w次阅读