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

    文章

    4710

    浏览量

    128796
  • Linux
    +关注

    关注

    87

    文章

    11239

    浏览量

    209053
  • WINDOWS
    +关注

    关注

    3

    文章

    3529

    浏览量

    88489
收藏 人收藏

    评论

    相关推荐

    图形用户界面与命令行接口的比较

    界面(GUI) : GUI是一种用户界面,允许用户通过图形图标和视觉指示与电子设备进行交互。 它通常包括窗口、按钮、图标和菜单等元素,用户可以通过鼠标或触摸屏进行操作。 命令行接口(CLI) : CLI是一种用户界面,用户通过输入文本
    的头像 发表于 11-12 14:38 245次阅读

    Mobaxterm 的命令行使用方法

    的远程桌面协议(如RDP和VNC),以及文件传输协议(如FTP和SFTP)。本文将详细介绍如何使用Mobaxterm的命令行功能。 2. 安装 Mobaxterm 在开始之前,确保你已经安装
    的头像 发表于 11-11 09:08 540次阅读

    APM32F411板的python+pyocd命令行操作

    前段时间学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?
    的头像 发表于 10-18 16:21 195次阅读
    APM32F411板的python+pyocd<b class='flag-5'>命令行</b>操作

    鸿蒙ArkUI-X跨平台开发:【命令行工具(ACE Tools)】

    ACE Tools是一套为ArkUI-X项目跨平台应用开发者提供的命令行工具,支持在Windows/Ubuntu/macOS平台运行,用于构建OpenHarmony/HarmonyOS、Android和iOS平台的应用程序,其功能包括开发环境检查,新建项目,编译打包,安装
    的头像 发表于 05-21 17:39 1683次阅读
    鸿蒙ArkUI-X跨平台开发:【<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>(ACE Tools)】

    高效云端管理的秘诀——华为云命令行工具 KooCLI

    发现了云上命令行工具,我的云端管理效率从此得到了质的飞跃。 我从华为云官方产品帮助文档中了解了 KooCLI 工具,文档中介绍的便捷操作和高效管理让我心动不已,于是,我开启了我的体验。通过简单的
    的头像 发表于 05-10 00:25 691次阅读
    高效云端管理的秘诀——华为云<b class='flag-5'>命令行</b><b class='flag-5'>工具</b> KooCLI

    鸿蒙OpenHarmony南向:【Hi3516标准系统入门(命令行方式)】

    除小型系统外,Hi3516DV300开发板还支持标准系统。此章节简要介绍如何使用命令行在Hi3516DV300开发板上进行标准系统的开发。
    的头像 发表于 05-08 09:26 830次阅读
    鸿蒙OpenHarmony南向:【Hi3516标准系统入门(<b class='flag-5'>命令行</b>方式)】

    HarmonyOS开发:【基于命令行(安装库和工具集)】

    使用命令行进行设备开发时,可以通过以下步骤安装编译OpenHarmony需要的库和工具
    的头像 发表于 04-25 21:03 385次阅读
    HarmonyOS开发:【基于<b class='flag-5'>命令行</b>(安装库和<b class='flag-5'>工具</b>集)】

    香港vps的centos如何切换命令行和桌面?

    要在CentOS上切换命令行和桌面环境,您可以通过以下步骤进行: 1、安装桌面环境:如果您的CentOS VPS上还没有安装图形桌面环境,您需要安装一个。一般来说,常用的桌面环境有GNOME、KDE
    的头像 发表于 04-10 17:41 610次阅读

    STM32G070RB使用jlink命令行下载无法识别芯片怎么解决?

    STM32G070RB 使用jlink命令行下载无法识别芯片,想手动添加芯片,请问哪里可以下载驱动.elf文件 或者有什么方法能够实现jlink命令行下载
    发表于 04-02 06:15

    分享一个据说是比Wget、Curl更强大的下载工具

    aria2 是一款轻量且高效的命令行下载工具。堪称下载利器!
    的头像 发表于 02-20 10:24 802次阅读
    分享一个据说是比Wget、Curl更<b class='flag-5'>强大</b>的下载<b class='flag-5'>工具</b>!

    tasking的命令行控制中如何生成makefiles文件?

    tasking的命令行控制中如何生成makefiles文件?
    发表于 02-06 07:56

    在Linux上如何通过命令行来更改日期和时间?

    在Linux上如何通过命令行来更改日期和时间? 在Linux上,我们可以使用命令行工具来更改日期和时间。操作系统中有一个专门的命令被称为“date”
    的头像 发表于 01-16 17:10 2761次阅读

    如何在ELF 1开发板实现命令行显示中文

    自busybox1.17.0以后的版本对中文的支持进行了限制,命令行不做修改是无法显示中文的。今天小编就带各位小伙伴了解一下如何实现在busybox1.17.0以上版本对命令行显示中文的支持。步骤一
    的头像 发表于 12-06 16:07 535次阅读
    如何在ELF 1开发板实现<b class='flag-5'>命令行</b>显示中文

    idea如何输入命令行参数

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

    eclipse怎么使用命令行

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