在NVIDIA GPU剖析杰森平台
这个例子向您展示了如何分析和优化生成的CUDA®代码的性能在杰森平台上使用gpuPerformanceAnalyzer
函数。
GPU编码器性能分析仪运行software-in-the-loop (SIL)执行收集指标CPU / GPU活动生成的代码并提供一个实足的时间表阴谋可视化识别和减轻CUDA代码生成的性能瓶颈。这个示例生成的性能分析报告特征匹配GPU编码器的例子。有关更多信息,请参见特征匹配。
先决条件
目标板需求
英伟达杰森嵌入式平台。
以太网交叉电缆来连接目标板和主机PC(如果目标不能被连接到一个本地网络)。
NVIDIA CUDA工具包安装在目标板上。
英伟达Nsight™系统在目标板上。
环境变量的编译器和库。设置环境变量,看到设置必备产品s manbetx 845。
本例的分析工作流取决于NVIDIA GPU访问性能计数器的分析工具。从CUDA工具包v10.1, NVIDIA限制访问性能计数器只有管理员用户。让GPU性能计数器被所有用户使用,见提供的指令许可问题性能计数器(英伟达)。
环境变量的目标编译器和库。信息支持版本的编译器和库及其设置,明白了万博1manbetx安装和设置先决条件NVIDIA董事会(MATLAB编码器支持包为万博1manbetxNVIDIA杰森和NVIDIA驱动平台)NVIDIA的董事会。
开发主机需求
NVIDIA CUDA工具包和司机。
环境变量的编译器和库。信息的支持版本的编译器和库,明白了万博1manbetx第三方硬件。设置环境变量,看到设置必备产品s manbetx 845。
验证NVIDIA支持包安装在万博1manbetx主机上
使用checkHardware万博1manbetxSupportPackageInstall
函数来验证主机系统兼容运行这个示例。
checkHardware万博1manbetxSupportPackageInstall ();
连接到NVIDIA硬件
GPU编码器支持NVIDIA万博1manbetx GPU包使用SSH连接在TCP / IP来构建和运行时执行命令生成的CUDA代码在杰森平台上。你必须将目标平台连接到同一网络主机或者使用以太网交叉电缆董事会直接连接到主机。请参阅NVIDIA文档如何设置和配置你的董事会。
与NVIDIA硬件进行通信,您必须创建一个生活硬件连接对象使用杰森
(MATLAB编码器支持包为万博1manbetxNVIDIA杰森和NVIDIA驱动平台)函数。你必须知道主机名或IP地址,用户名和密码的目标板创建一个生活硬件连接对象。例如,当连接到目标板第一次创建一个活动对象为杰森硬件使用命令:
hwobj =杰森(“主机”,“用户名”,“密码”);
杰森对象重用这些设置从最近的成功连接到jetson硬件。这个例子建立SSH连接到杰森硬件使用设置存储在内存中。
hwobj =杰森;
检查CUDA可用性目标……检查“nvcc”在目标系统路径…检查cuDNN库可用性目标……检查TensorRT库可用性目标……检查先决条件库完成。收集硬件信息…检查第三方库可用性目标……收集完成硬件细节。委员会名称:英伟达杰森AGX Xavier开发工具包CUDA版本:11.4 cuDNN版本:8.4 TensorRT版本:8.4 GStreamer版本:1.16.3 V4L2版本:1.18.0-2build1 SDL版本:1.2 OpenCV版本:4.5.4可用网络摄像头:罗技摄像头C925e可用gpu: Xavier可用数字针:7 11 12 13 15 16 18 19日21日22日23日24日26日29日31日32 33 35 36 37 38 40
在连接失败的情况下,诊断错误消息报道在MATLAB命令行。如果连接失败,最可能的原因是不正确的IP地址或主机名。
当有多个活连接为不同的目标对象,代码生成器执行远程为最近的生活建立在目标对象被创建。选择硬件板执行远程构建、使用setupCodegenContext ()
各自的生活硬件对象的方法。如果只有一个连接对象被创建时,它没有必要调用这个方法。
hwobj.setupCodegenContext;
验证GPU环境目标
使用coder.checkGpuInstall
函数来确认所需的编译器和库运行这个例子是正确设置。
envCfg = coder.gpuEnvConfig (“杰森”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;envCfg。HardwareObject = hwobj;coder.checkGpuInstall (envCfg);
特征检测与提取
对于这个示例,特征匹配上执行两个图像旋转和缩放彼此。前两张图片可以匹配,必须为每个图像特征点检测和提取。以下featureDetectionAndExtraction
函数使用冲浪(detectSURFFeatures
(计算机视觉工具箱))当地检测特征点和特征检测器extractFeatures
(计算机视觉工具箱)提取特征。
这个函数featureDetectionAndExtraction
返回refPoints
,其中包含的特征坐标参考图像,qryPoints
,包含功能查询图像的坐标,refDesc
矩阵包含图像特征描述符和引用qryDesc
矩阵包含查询图像特征描述符。
refPoints =参考图像特征坐标。
qryPoints =查询图像特征坐标。
refDescFeat =参考图像特征描述符。
qryDescFeat =查询图像特征描述符。
K = imread (“cameraman.tif”);refImage = imresize (K, 3);规模= 0.7;J = imresize (refImage、规模);θ= 30.0;qryImage = imrotate (J,θ);[refPoints, refDescFeat qryPoints qryDescFeat] = featureDetectionAndExtraction (refImage,…qryImage);
的feature_matching
入口点函数
的feature_matching
函数从两幅图像提取的特征点和特征描述符以及它们之间找到一个匹配。
类型feature_matching
函数[matchedRefPoints matchedQryPoints] = feature_matching (refPoints,……refDesc、qryPoints qryDesc) % # codegen % 2018 - 2021版权MathWorks, inc . coder.gpu.kernelfun;% %特性匹配[indexPairs matchMetric] = matchFeatures (refDesc qryDesc);matchedRefPoints = refPoints (indexPairs (: 1):);matchedQryPoints = qryPoints (indexPairs (:, 2):);
生成性能分析报告
分析生成的代码使用的性能gpuPerformanceAnalyzer
代码,创建一个配置对象动态库(“dll”
)建造类型。因为gpuPerformanceAnalyzer
函数只接受一个嵌入式编码器™配置对象,使选项创建一个coder.EmbeddedCodeConfig
配置对象。
cfg = coder.gpuConfig (“dll”,“是”,真正的);
您还可以使用GPU性能分析器分析深度学习应用程序和嵌入式应用程序针对NVIDIA®杰森™和NVIDIA驱动®平台。使用gpuPerformanceAnalyzer
对于嵌入式目标,设置硬件属性代码的配置对象到适当的目标平台。
cfg。硬件= coder.Hardware (英伟达杰森的);
运行gpuPerformanceAnalyzer
使用默认迭代数为2。
输入= {refPoints, refDescFeat、qryPoints qryDescFeat};designFileName =“feature_matching”;gpuPerformanceAnalyzer (designFileName输入,…“配置”cfg,“NumIterations”2);
检查CUDA可用性目标……检查“nvcc”在目标系统路径…代码生成# # # # # #开始GPU连接配置功能“feature_matching”:“英伟达杰森”公益诉讼执行使用端口17725。公益诉讼执行使用接收超时30秒(s)。代码生成成功:视图报告代码生成完成了# # # # # # GPU开始应用程序:“codegen / dll feature_matching /公益诉讼/ feature_matching。精灵的终止执行:明确feature_matching_pil # # #启动应用程序feature_matching.elf……公益诉讼执行终止。# # # # # #开始分析数据处理分析数据处理完成了# # #显示分析数据
GPU性能分析器
GPU性能分析器暴露GPU和CPU活动,事件,和性能指标采用按时间顺序罗列工作时间表阴谋准确地想象,识别并解决性能瓶颈在生成的CUDA®代码。
这些数字是代表。实际值取决于你的硬件设置。这个分析是通过使用MATLAB R2023a使用主机与一个6芯,3.5 ghz Xeon®®CPU和NVIDIA泰坦XP GPU和杰森AGX Xavier开发工具包。
分析时间
分析时间线显示了完整的跟踪运行时的所有事件高于阈值。分析跟踪显示的一个片段。
您可以使用鼠标滚轮(或一个等价的触摸板选项)放大的时间表。或者,您可以使用面板的顶部的时间总结变焦和导航时间表阴谋。
每个事件的工具提示显示开始时间,结束时间和持续时间的选择事件的CPU和GPU。也表明之间的时间内核启动的CPU和GPU的实际执行内核。
事件统计
事件统计面板显示为选定的事件的额外信息。例如,feature_matching_kernel1
显示以下数据:
的见解
的见解面板提供了一个饼图概述GPU和CPU活动。饼图的变化根据缩放级别的分析时间。见解面板显示的一个片段。在该地区选择在时间轴上,它表明GPU利用率仅为52%。
调用树
本节列出了GPU事件从CPU。调用树中的每个事件列表调用函数的执行时间的百分比。这个指标可以帮助你识别性能瓶颈在生成的代码。你也可以导航到特定事件的分析时间轴通过点击相应的事件调用树。
过滤器
本节为该报告提供了过滤选项。
视图模式——使用这个选项来查看分析结果为整个应用程序(包括初始化和终止)或设计功能(没有初始化和终止)。
事件阈值——跳过事件小于给定的阈值。
内存分配/自由-显示GPU设备内存分配和重分配CPU活动栏上的相关事件。
内存传输——显示host-to-device和device-to-host内存传输。
内核——显示CPU内核启动和GPU内核活动。
其他人——显示其他GPU相关事件,如同步和等待GPU。
改善Feature_Matching的性能
从性能分析报告,很明显,执行时间的很大一部分都花在内存分配和重分配。为了提高性能,你可以打开GPU内存管理器并再次运行分析。
cfg = coder.gpuConfig (“dll”);cfg.GpuConfig。EnableMemoryManager = true;cfg。硬件= coder.Hardware (英伟达杰森的);gpuPerformanceAnalyzer (designFileName输入,…“配置”cfg,“NumIterations”2);
检查CUDA可用性目标……检查“nvcc”在目标系统路径…代码生成# # # # # #开始GPU连接配置功能“feature_matching”:“英伟达杰森”公益诉讼执行使用端口17725。公益诉讼执行使用接收超时30秒(s)。代码生成成功:视图报告代码生成完成了# # # # # # GPU开始应用程序:“codegen / dll feature_matching /公益诉讼/ feature_matching。精灵的终止执行:明确feature_matching_pil # # #启动应用程序feature_matching.elf……公益诉讼执行终止。# # # # # #开始分析数据处理分析数据处理完成了# # #显示分析数据
随着GPU内存管理器,利用GPU已经增加到76%。