主要内容

数值等价测试

通过使用GPU加速和环中处理器(PIL)模拟,测试模型组件和从组件生成的产品代码之间的数值等价性。

使用GPU加速模拟,您可以在开发计算机上测试源代码。使用PIL模拟,您可以通过在实际目标硬件上运行目标代码来测试打算部署到目标硬件上的已编译的目标代码。要确定模型组件和生成的代码在数值上是否等效,请将GPU加速和PIL结果与正常模式结果进行比较。

目标连接配置PIL

在您可以运行PIL模拟之前,您必须配置目标连接。目标连通性配置使PIL模拟能够:

  • 构建目标应用程序。

  • 下载、启动和停止目标上的应用程序。

  • 金宝app支持Simulink之间的通信金宝app®和目标。

为NVIDIA等硬件平台生成目标连接配置®驱动和Jetson,安装MATLAB®编码器™金宝app支持包的NVIDIA Jetson®和NVIDIA DRIVE™平台。

请注意

从R2021a开始用于NVIDIA Jets金宝appon和NVIDIA DRIVE的MATLAB编码器支持包®平台被命名为MATLAB编码器金宝app支持包的NVIDIA Jetson和NVIDIA驱动平台。要在R2021a中使用此金宝app支持包,您必须具有MATLAB编码器产品。

目标板需求

  • NVIDIA DRIVE或Jetson嵌入式平台。

  • 用于连接目标板和主机PC(如果无法连接到本地网络)的以太网交叉线缆。

  • NVIDIA CUDA®工具箱安装在板上。

  • 目标上的编译器和库的环境变量。有关编译器、库及其设置所支持的版本的信息,请参金宝app见NVIDIA主板的安装和设置必备事项(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB编码器支持包)

创建实时硬件连接对象

支持包软金宝app件使用TCP/IP上的SSH连接来执行命令,同时在DRIVE或Jetson平台上构建和运行生成的CUDA代码。将目标平台与主机连接到同一网络,或者使用以太网交叉网线直接将单板与主机连接。有关如何设置和配置您的主板,请参阅NVIDIA文档。

要与NVIDIA硬件通信,可以使用杰森(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB编码器支持包)开车(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB编码器支持包)函数。使用该功能创建实时硬件连接对象时,需要提供目标单板的主机名或IP地址、用户名和密码。例如,要为Jetson硬件创建活动对象:

hwobj =杰森(“192.168.1.15”、“ubuntu”、“ubuntu”);

该软件执行硬件、编译工具、库、IO服务器安装检查,并收集目标上的外围信息。此信息将显示在“命令窗口”中。

检查CUDA在目标上的可用性…在目标系统路径中检查NVCC…检查CUDNN库在目标上的可用性…在Target上检查TensorRT库的可用性…现在已经完成了对先决条件库的检查。获取硬件细节……获取硬件细节现在已经完成。显示详细信息。主板名称:NVIDIA Jetson TX2 CUDA Version: 9.0 cuDNN Version: 7.0 TensorRT Version: 3.0可用摄像头:UVC Camera (046d:0809)可用gpu: NVIDIA Tegra X2

或者,为DRIVE硬件创建活动对象:

hwobj =驱动(“92.168.1.16”、“英伟达”,“英伟达”);

请注意

如果存在连接失败,则在MATLAB命令窗口上报告诊断错误消息。如果连接失败,最有可能的原因是错误的IP地址或主机名。

例如:Mandelbrot集合

描述

曼德尔勃洛特集是复平面中由这些值组成的区域z0由这个方程定义的轨迹是有界的k→∞

z k + 1 z k 2 + z 0 k 0 1 ...

Mandelbrot集合的整体几何结构如图所示。这个观点没有分辨率显示丰富详细的结构边缘的边界以外的集合。在不断放大的情况下,Mandelbrot集合展示了一个复杂的边界,揭示了越来越精细的递归细节。

曼德尔勃洛特集的几何

算法

对于本教程,选择一组限制,指定在主心脏线和之间的谷中Mandelbrot集合的高度放大部分p / q灯泡在它的左边。由实零件组成的1000 × 1000的网格(x)和虚部(y)是在这两个界限之间创建的。然后在每个网格位置迭代Mandelbrot算法。迭代次数为500时,图像将呈现为全分辨率。

maxIterations = 500;gridSize = 1000;xlim = [-0.748766713922161, -0.748766707771757];ylim = [0.123640844894862, 0.123640851045266];

本教程使用在CPU上运行的标准MATLAB命令来实现Mandelbrot集。这个计算被向量化,这样每个位置都是同时更新的。

GPU加速或PIL模拟与一个顶级模型

通过运行顶级模型PIL模拟来测试生成的模型代码。用这种方法:

  • 您将测试从顶部模型生成的代码,该模型使用独立的代码接口。

  • 您可以配置模型以加载测试向量或来自MATLAB工作空间的刺激输入。

  • 您可以轻松地切换顶部模型之间的正常,GPU加速和PIL模拟模式。

创建Mandelbrot Top Model

  1. 创建一个Simul金宝appink模型并插入一个MATLAB函数块的用户定义函数图书馆。

  2. 双击MATLAB函数块。函数的默认签名出现在MATLAB函数块编辑器。

  3. 定义一个名为mandelbrot_count,它实现了Mandelbrot算法。函数头文件声明maxIterationsxGrid,yGrid作为一个论点mandelbrot_count函数,作为返回值。

    函数count = mandelbrot_count(maxIterations, xGrid, yGrid)曼德布洛特百分比计算z0 = xGrid + 1i*yGrid;数= 1(大小(z0));将计算映射到GPUcoder.gpu.kernelfun;z = z0;n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count +内部;结束数=日志(数);

  4. 的块参数MATLAB函数块。在代码生成选项卡上,选择可重用的功能函数包装参数。

    如果函数包装参数设置为任何其他值,CUDA内核可能不会生成。

  5. 添加轮廓尺寸(金宝app模型)块和外港(金宝app模型)块的来源图书馆。

  6. 如图所示连接这些块。将模型保存为mandelbrot_top.slx

    金宝app显示块之间连接的Simulink模型。

配置GPU加速的型号

要专注于数值等价测试,请关闭:

  • 模型覆盖

  • 代码覆盖率

  • 执行时间分析

模型=“mandelbrot_top”;close_system(模型中,0);open_system(模型)set_param (gcs,“RecordCoverage”“关闭”);coverageSettings = get_param(模型,“CodeCoverageSettings”);coverageSettings。CoverageTool =“没有”;set_param(模型,“CodeCoverageSettings”, coverageSettings);set_param(模型,“CodeExecutionProfiling”“关闭”);

配置输入的刺激数据。下面几行代码生成一个1000 × 1000的实际部件网格(x)和虚部(y)之间的界限xlimylim

gridSize = 1000;Xlim = [-0.748766713922161, -0.748766707771757];Ylim = [0.123640844894862, 0.123640851045266];x = linspace(xlim(1), xlim(2), gridSize);y = linspace(ylim(1), ylim(2), gridSize);[xG, yG] = meshgrid(x, y);maxIterations = timeseries (500 0);xGrid = timeseries (xG, 0);yGrid = timeseries (yG, 0);

在模型中配置日志记录选项。

set_param(模型,“LoadExternalInput”“上”);set_param(模型,“ExternalInput”“maxIterations xGrid yGrid”);set_param(模型,“SignalLogging”“上”);set_param(模型,“SignalLoggingName”“logsOut”);set_param(模型,“SaveOutput”“上”

运行正常和PIL模拟

运行普通模式模拟。

set_param(模型,“SimulationMode”“正常”) set_param(模型,“GPUAcceleration”“上”);sim_output = sim(模型、10);count_normal = sim_output.yout {1} .Values.Data (:,: 1);

运行一个顶级模型PIL模拟。

set_param(模型,“SimulationMode”“Processor-in-the-Loop(公益诉讼)) sim_output = sim(模型,10);count_pil = sim_output.yout {1} .Values.Data (:,: 1);
###目标设备没有本机通信支持。金宝app检查连接配置注册…# # #开始构建过程:mandelbrot_top和工件生成代码的# # # # # #生成模型特定的文件夹结构代码构建文件夹:/ mathworks /例子/ sil_pil mandelbrot_top_ert_rtw # # #为“mandelbrot_top”所生成的代码是最新的,因为没有结构,参数或代码替换库的变化被发现。### #使用工具链:NVCC for NVIDIA Embedded Processors ### # '/mathworks/examples/sil_pil/mandelbrot_top_ert_rtw/mandelbrot_top. ### #使用工具链:NVCC for NVIDIA Embedded Processors### # build 'mandelbrot_top':mkbuildobj ###成功完成的构建过程为:mandelbrot_top构建摘要顶部模型目标构建:模型动作重建原因============================================================================= mandelbrot_top代码编译编译工件已经过时。Build duration: 0h 0m 22.94s ###目标设备没有本机通信支持。金宝app检查连接配置注册…### NVIDIA Jetson的PIL执行使用端口17725公益诉讼执行使用30秒来接收超时。###准备启动PIL模拟… ### Using toolchain: NVCC for NVIDIA Embedded Processors ### '/mathworks/examples/sil_pil/mandelbrot_top_ert_rtw/pil/mandelbrot_top.mk' is up to date ### Building 'mandelbrot_top': make -f mandelbrot_top.mk all ### Starting application: 'mandelbrot_top_ert_rtw/pil/mandelbrot_top.elf' ### Launching application mandelbrot_top.elf... PIL execution terminated on target.

除非存在该模型的最新代码,否则将生成并编译新的代码。生成的代码在您的计算机上作为一个单独的进程运行。

绘制和比较正常和PIL模拟的结果。观察结果是否匹配。

图();Subplot (1,2,1) imagesc(x, y, count_normal);Colormap ([jet();flipud(jet());0 0 0]);标题(“Mandelbrot集正态模拟”);轴;Subplot (1,2,2) imagesc(x, y, count_pil);Colormap ([jet();flipud(jet());0 0 0]);标题(曼德尔勃特集合公益诉讼的);轴

Mandelbrot设置从正常和PIL模拟输出

清理。

close_system(模型中,0);如果ishandle(图一),关闭(图一),结束清晰的图一simResults = {“count_sil”“count_normal”“模型”};保存([模型“_results”), simResults {:});明确(simResults {:},“simResults”

限制

使用GPU Coder™的处理器在循环(PIL)金宝app模拟不支持mat文件日志记录。

另请参阅

功能

相关的话题