< >
Home » TK1入门教程软件篇 » TK1入门教程软件篇-安装Nsight

TK1入门教程软件篇-安装Nsight

TK1入门教程软件篇-安装Nsight

说明:

  • 介绍在TK1上安装Nsight Eclipse Edition
  • 介绍基于ARM的开发套件NVIDIA Jetson TK1远程开发CUDA应用程序的过程

Nsight简介:

  • NVIDIA®Nsight™Eclipse Edition是一款全功能的集成开发环境
  • 可让您轻松开发本地(x86)系统或远程(x86或ARM)目标的CUDA®应用程序。
  • Nsight支持两种远程开发模式:交叉编译和“同步项目”模式。
  • 您的x86主机系统上的ARM交叉编译需要您的主机系统上存在用于链接应用程序的所有ARM库。
  • 在同步项目模式中,您的源代码在主机和目标系统之间进行同步,并直接在远程目标上进行编译和链接,这具有所有库在目标系统上解决而无需存在的优点在主机上。
  • 这些远程开发模式都不需要NVIDIA GPU存在于您的主机系统中

注意:

  • ARM的CUDA交叉编译工具仅在CUDA 6 Toolkit的Ubuntu 12.04 DEB软件包中可用。
  • 如果您的主机系统正在运行Ubuntu 12.04以外的Linux发行版,那么我建议使用synchronize-projects远程开发模式

CUDA工具包安装:

  • 交叉编译的第一步:在您的主机系统上安装CUDA 6 Toolkit
  • 下载cuda地址:
https://developer.nvidia.com/cuda-downloads
  • 1.启用armhf作为外部架构,以便安装Cross-armhf软件包:
$ sudo sh -c \ 'echo "foreign-architecture armhf" >> /etc/dpkg/dpkg.cfg.d/multiarch'
$ sudo apt-get update
  • 2.运行dpkg来安装和更新repo元数据:
$ sudo dpkg – i cuda-repo-ubuntu1204_6.0-37_amd64.deb
$ sudo apt-get update
  • 3.安装cuda cross和ARM GNU软件包(这些将在将来的工具包版本中链接):
$ sudo apt-get install cuda-cross-armhf
$ sudo apt-get install g ++  -  4.6-arm-linux-gnueabihf
  • 4.可选 - 如果您还希望在主机系统中进行本机x86 CUDA开发并具有NVIDIA GPU,那么您可以安装完整的工具链和驱动程序
$ sudo apt-get install cuda
  • 如果您安装了驱动程序,以便NVIDIA驱动程序加载,请重新启动系统。
  • 然后更新路径到工具包安装位置,如下所示:
$ export PATH=/usr/local/cuda/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
  • 在这些步骤结束时,您应该看到armv7-linux-gnueabihf和/usr/local/cuda/targets/下的可选x86_64_linux文件夹

  • 对于您的交叉开发需求,Jetson TK1预装了用于Tegra(L4T)的Linux,这是NVIDIA提供的修改的Ubuntu(13.04或更高版本)Linux发行版。

  • NVIDIA提供电路板支持包和包含CUDA工具包,OpenGL 4.4驱动程序和NVIDIA VisionWorks™工具包的软件堆栈。

  • 您可以从Jetson TK1支持页面下载所有这些以及示例和文档

导入Jetson TK1 CUDA样品到Nsight

  • 在安装了CUDA Toolkit并在主机系统上设置路径后,在命令行中键入“nsight”(不带引号)

  • 或在Ubuntu仪表板中找到Nsight图标,即可启动Ns​​ight。

  • 加载Nsight后,导航到File-> New-> CUDA C / C ++ Project并导入现有的CUDA示例以启动“项目创建”向导

  • 对于项目名称,输入“boxfilter-arm”,并在工程类型中选择“导入CUDA样本”,并在工具链中选择“CUDA Toolkit 6.0”

  • 接下来,选择可以在Imaging类别下找到的Boxfilter样本

  • 向导中剩余的选项可以选择哪些GPU和CPU架构来生成代码

    • 我们将选择由nvcc编译器生成的GPU代码。
    • 由于Jetson TK1包括NVIDIA Kepler™GPU,选择SM32 GPU二进制代码和SM30 PTX中间代码。(后者是任何开普勒级GPU可以运行此应用程序。)
  • 向导中的下一页可以让您决定是否希望为ARM系统进行本机x86开发或交叉编译

  • 要交叉编译ARM,请在CPU架构下拉框中选择ARM体系结构

请输入图片描述

构建您的第一个Jetson TK1应用程序:

  • CUDA样本是可以导入和运行在各种硬件配置上的通用代码示例
  • 对于这种交叉构建练习,必须首先解决此应用程序使用的ARM库依赖关系。
  • 以下是您可以解决的问题:
  • 1.右键单击项目并导航到Properties->Build->Settings->Tool Settings->NVCC Linker->Libraries ,并更新路径以指向 linux/armv7l而不是 linux/x86_64。
  • 这将解决libGLEW库依赖关系。
  • 也删除GLU的条目,因为该库未被使用。

-

  • 2.单击Miscellaneous选项卡,并添加一个新的-Xlinker选项“-unresolved-symbols = ignore-in-shared-libs”(不带引号)

  • 3.在终端窗口中,使用scp实用程序从Jetson TK1中复制剩余的库:

scp ubuntu@your.ip.address:/usr/lib/arm-linux-gnueabihf/libglut.so.3  /usr/arm-linux-gnueabihf/lib folder, with a symlink to libglut.so
scp ubuntu@your.ip.address:/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1 /usr/arm-linux/gnueabihf/lib folder, with a symlink to libGL.so
scp ubuntu@your.ip.address:/usr/lib/arm-linux-gnueabihf/libX11.so.6 /usr/arm-linux-gnueabihf/lib folder, with a symlink to libX11.so
  • 注意:您只需为第一个CUDA样本复制这些ARM库。您可能需要其他样品的其他库。
  • ARM交叉开发的构建过程与本地构建过程类似。
  • 只需点击工具栏菜单中的“hammer”图标即可构建一个调试ARM二进制文件。
  • 作为编译过程的一部分,Nsight将为GPU代码和arm-linux-gnueabihf-g++-4.6交叉编译器为CPU代码启动nvcc
  • 如下所示:
Building file: ../src/boxFilter_kernel.cu
Invoking: NVCC Compiler
/usr/local/cuda-6.0/bin/nvcc -I"/usr/local/cuda-6.0/samples/3_Imaging" -I"/usr/local/cuda-6.0/samples/common/inc" 
-I"/home/satish/cuda-workspace_new/boxfilter-arm" -G -g -O0 -ccbin arm-linux-gnueabihf-g++-4.6 -gencode arch=compute_30,
code=sm_30 -gencode arch=compute_32,code=sm_32 --target-cpu-architecture ARM -m32 -odir "src" -M -o "src/boxFilter_kernel.d" 
"../src/boxFilter_kernel.cu"
/usr/local/cuda-6.0/bin/nvcc --compile -G -I"/usr/local/cuda-6.0/samples/3_Imaging" -I"/usr/local/cuda-6.0/samples/common/inc" 
-I"/home/satish/cuda-workspace_new/boxfilter-arm" -O0 -g -gencode arch=compute_30,code=compute_30 -gencode arch=compute_32,
code=sm_32 --target-cpu-architecture ARM -m32 -ccbin arm-linux-gnueabihf-g++-4.6  -x cu -o  "src/boxFilter_kernel.o" 
"../src/boxFilter_kernel.cu"
Finished building: ../src/boxFilter_kernel.cu
  • 在编译步骤之后,链接器将解析所有库引用,为您提供一个可以运行的boxfilter-arm二进制文件。

从Nsight运行您的第一个Jetson TK1应用程序:

  • 要运行目标Jetson TK1系统上的代码,请单击Run As->Remote C/C++ Application来设置目标系统用户和主机地址。

请输入图片描述

  • 完成远程目标系统配置设置后,单击运行图标,您将看到一个新条目,以在Jetson TK1上运行boxfilter-arm二进制文件。

  • 注意:框过滤器应用程序依赖于驻留在应用程序的数据/子文件夹中的数据文件,这些数据文件将需要复制到目标系统。

  • 使用scp实用程序将这些文件复制到Jetson TK1上的/tmp/nsight-debug/data/文件夹中。

  • 接下来,按如下所示编辑boxfilter.cpp文件:

  • 1.要确保应用程序在正确的显示设备上运行,请将此行添加到主函数的顶部:

    setenv(“DISPLAY”, “:0”, 0);

  • 2.将以下行添加到显示功能的顶部,以便应用程序在几秒钟后自动终止。

  • 在多个应用程序运行中收集确定性执行数据是必需的,稍后我们将在分析部分中

static int icnt = 120;
while(!icnt--)
{
    cudaDeviceReset();
    _exit(EXIT_SUCCESS);
}
  • 单击运行以在Jetson TK1上执行修改后的Box Filter应用程序

调试您的第一个Jetson TK1应用程序在Nsight

  • 您之前在Nsight中设置的远程目标系统配置也将在工具栏中的调试器图标下可见。
  • 在启动调试器之前,请注意,默认情况下,Jetson TK1不允许任何应用程序在100%的时间内完全占用GPU。
  • 为了运行调试器,我们需要解决这个问题。
  • 在您的Jetson TK1上,以root用户身份登录(sudo su),然后按照以下步骤禁用超时(在将来的CUDA版本中,调试器将自动处理):
root@tegra-ubuntu:/home/ubuntu# echo N > sys/kernel/debug/gk20a.0/timeouts_enabled
  • 现在我们可以使用主机系统上的调试图标启动调试器。

  • Nsight将切换到其调试器的角度,并打破CPU代码中的第一条指令。

  • 您可以单步一步查看CPU上的执行情况,并在更新变量和寄存器时进行监视。

  • 要在GPU上执行的任何和所有CUDA内核,请转到Nsight右上窗格中的断点选项卡,然后单击多维数据集图标下拉列表。

  • 然后选择“应用程序内核启动”功能,突破CUDA内核启动的第一条指令。

  • 您现在可以恢复应用程序,直到第一个断点在CUDA内核中。

  • 从这里,您可以在左上角的窗格中浏览CPU和GPU调用堆栈。

  • 您还可以在右上窗格中查看变量,寄存器和HW状态。

  • 您可以看到,Jetson TK1的GPU正在执行16个64个线程,每个线程都运行在该GK20A GPU的单个流式多处理器(SMX)上。

  • 您还可以切换到反汇编视图,并通过单击i->图标来观察正在更新的寄存器值,以执行GPU指令级单步执行。

请输入图片描述

  • 要“引导”(专注于)特定的GPU线程,请双击右上窗格中CUDA选项卡中感兴趣的线程。

  • 固定的CUDA线程将显示在左上角的窗格中,允许您选择和单步执行这些线程。

  • (请记住,单步执行给定线程会导致同一个warp的剩余线程同步,因为它们共享一个程序计数器。)

  • 您可以通过固定属于不同经线的线程来实验并观察。

  • 通过从调试图标下拉列表中进入调试配置设置,您可以找到更多有用的调试功能,例如启用cuda-memcheck并附加到正在运行的进程(仅在主机系统上)。

  • 要退出正在调试的应用程序,请单击调试器透视图中的红色停止按钮。

在Nsight中分析您的第一个Jetson TK1应用程序

  • 让我们切换回C ++项目编辑器视图来启动分析器运行。

  • 您在Nsight早期设置的远程目标系统配置也将在工具栏中的profiler图标下可见。

  • 在启动概要分析器之前,请注意,您需要使用包含在编译选项中的-lineinfo创建发行版本。

  • 这告诉编译器生成源到指令关联的信息。为此,首先,通过右键单击左侧窗格中的项目,进入项目设置。然后导航到 Properties->Build->Settings->Tool Settings->Debugging ,并选中“生成行号...”框,然后单击应用。

  • 回到主窗口,点击build hammer下拉菜单,创建一个发布版本。解决任何构建问题,就像在上面的第一个运行中所做的一样,然后单击 Run As->Remote C/C++ Application 来运行应用程序的发行版本。

  • 此时,Nsight将使用您要配置文件的发行版二进制覆盖Jetson TK1系统并运行一次。

  • 然后点击配置文件图标下拉菜单,选择配置文件配置,您必须选择“配置文件远程应用程序”,因为二进制文件已经在Jetson TK1上。

  • 然后,Nsight将在您运行应用程序时将其转换到剖析器视图,以收集所有CUDA运行时和驱动程序API调用以及在GPU上执行的内核的执行时间线视图。

  • 属性选项卡显示从此时间轴中选择的任何事件的详细信息; 事件的详细信息也可以在文本窗体的“详细信息”选项卡中查看。

请输入图片描述

  • 在下方窗格中的时间轴视图下方,还有一个“分析”选项卡对于性能调优非常有用。

  • 它将引导您逐步解决应用程序中的性能瓶颈。

  • 您可以通过点击“分析”选项卡下的图标,在引导和非指导分析之间切换。

  • 您还可以获得源到指令的相关视图,其中显示红色的热点(指令执行计数特别高),如下图所示。

请输入图片描述

  • 您可以从引导分析模式中获取此视图,方法是首先单击“检查个体内核”,并从已检查内核列表中选择排名最高的(100)内核,然后单击“执行内核分析”,然后单击“执行计算分析”。

  • 从那里,单击“显示内核配置文件”将在右窗格中显示d_boxfilter_rgba_a内核。

  • 双击内核名称以查看源到指令视图。单击给定的源代码行将突出显示相应的GPU指令。

  • 您可以看到,无论您是NVIDIA®Nsight™Eclipse Edition还是新一代的Nsight用户,Nsight都可以轻松简单地为Jetson TK1平台创建CUDA应用程序,同时支持所有支持CUDA的GPU。

参考:

  • http://elinux.org/Jetson/Tutorials/Nsight
  • https://devblogs.nvidia.com/parallelforall/nvidia-nsight-eclipse-edition-for-jetson-tk1/
  • nsight-eclipse
  • https://developer.nvidia.com/nsight-visual-studio-edition-downloads
  • https://developer.nvidia.com/nsight-eclipse-edition
  • how-to-use

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: tk1入门教程软件篇