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
    +关注

    关注

    27

    文章

    4415

    浏览量

    126652
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • WINDOWS
    +关注

    关注

    3

    文章

    3438

    浏览量

    87142
收藏 人收藏

    评论

    相关推荐

    idea如何输入命令行参数

    在许多软件开发和系统管理的任务中,我们经常需要向应用程序传递命令行参数。命令行参数是在运行时传递给程序的值,用于指定程序的行为和配置选项。本文将详细介绍如何在不同的编程语言和操作系统中输入命令行参数
    的头像 发表于 12-06 15:01 364次阅读

    eclipse怎么使用命令行

    命令行中使用Eclipse来完成一些特定的任务。本文将详细介绍如何在命令行中使用Eclipse。 首先,我们需要确保已经正确安装了JDK(Java Development Kit)和Eclipse
    的头像 发表于 12-06 11:26 924次阅读

    pycharm命令行终端运行代码

    Python是一种非常流行的编程语言,许多开发者使用它来编写各种应用程序和脚本。为了方便开发者编写和测试代码,PyCharm是一种集成开发环境(IDE),它提供了许多功能和工具,其中包括命令行终端
    的头像 发表于 11-22 11:20 1333次阅读

    linux命令行运行步骤

    运行Linux命令行涉及以下步骤: 打开终端 在Linux系统中,打开命令行界面的方式有多种,最常见的是打开终端应用程序。可以在应用程序菜单中找到终端,点击打开。 熟悉命令行提示符 在终端中,会发
    的头像 发表于 11-17 10:18 340次阅读

    linux虚拟机怎么调出命令行

    命令行的方式可以因不同的虚拟机软件而异,下面将介绍几种常用的虚拟机软件以及它们调出命令行的方法。 VMware虚拟机 VMware是一个功能强大的虚拟机软件,它具有广泛的应用领域和用户群体。在VMware虚拟机中,你可以通过以下
    的头像 发表于 11-17 09:55 2110次阅读

    linux切换到命令行模式

    在Linux中,可以通过以下步骤切换到命令行模式: 打开终端。可以在应用菜单中找到终端或命令行终端。 在终端中输入命令“exit”或“logout”,然后按回车键。 系统会提示您输入管理员密码。输入
    的头像 发表于 11-13 16:47 806次阅读

    linux虚拟机怎么调出命令行

    在Linux虚拟机中调出命令行界面,可以通过以下步骤实现: 打开虚拟机,进入到Linux系统。 在桌面或应用菜单中找到终端或命令行图标,点击打开。 输入命令行指令,执行相应的操作。 另外,也可以通过
    的头像 发表于 11-08 11:28 1635次阅读

    linux命令行与shell编程实战

    Linux命令行与Shell编程实战主要涉及以下内容: Linux命令行基础:学习Linux命令行的基本操作,如文件管理、进程管理、网络配置等。熟悉使用命令行能够提高工作效率,提升自己
    的头像 发表于 11-08 10:57 362次阅读

    通用命令行工具ADB(Android Debug Bridge)常见的ADB命令

    ADB(Android Debug Bridge)是一种通用命令行工具,可以让您通过计算机与设备通信。
    的头像 发表于 11-05 11:26 399次阅读

    用于分析可执行程序和内存转储的命令行工具介绍

    Axf Tool 是桃芯科技一个用于分析可执行程序和内存转储的命令行工具。该工具已集成到 ingWizard 的项目快捷菜单里。
    的头像 发表于 11-03 17:00 633次阅读
    用于分析可执行程序和内存转储的<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>介绍

    一个开源MCU级的命令行交互组件

    一个开源MCU级命令行交互组件~
    的头像 发表于 10-17 16:26 189次阅读
    一个开源MCU级的<b class='flag-5'>命令行</b>交互组件

    2Printer命令行工具简述

    我们有另一种方法来促进您组织中的打印——这个解决方案称为2Printer。由于它没有用户界面,它主要是系统集成商和软件开发人员的工具。所有命令都通过命令提示符或 PowerShell输入,或者您可以创建包含在BAT、CMD或 V
    的头像 发表于 09-28 09:55 454次阅读
    2Printer<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>简述

    PetaLinux工具文档:命令行参考指南

    电子发烧友网站提供《PetaLinux工具文档:命令行参考指南.pdf》资料免费下载
    发表于 09-15 14:52 0次下载
    PetaLinux<b class='flag-5'>工具</b>文档:<b class='flag-5'>命令行</b>参考指南

    介绍Go里面经常使用到的命令行工具

    优秀的工具配合熟练的使用,往往可以让开发效率大幅度提升,本小节介绍 Go 里面经常使用到的命令行工具
    的头像 发表于 05-22 16:58 819次阅读
    介绍Go里面经常使用到的<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>

    Fcoder从命令行批量转换为TIFF

    命令行批量转换为TIFF 2TIFF图像转换软件是一个专业的命令行实用程序,用于以批处理模式将办公文档和图像转换为TIFF。基于简单的命令行语法,它可以在PC、服务器上使用,也可以内置到任
    的头像 发表于 05-22 14:13 426次阅读
    Fcoder从<b class='flag-5'>命令行</b>批量转换为TIFF