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 CUDA样品到Nsight
在安装了CUDA Toolkit并在主机系统上设置路径后,在命令行中键入“nsight”(不带引号)
或在Ubuntu仪表板中找到Nsight图标,即可启动Nsight。
加载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
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号