数值等效检验
通过使用GPU加速和处理器在环(PIL)模拟,测试模型组件和从组件生成的产品代码之间的数值等效性。
使用GPU加速模拟,您可以在开发计算机上测试源代码。使用PIL模拟,您可以通过在实际目标硬件上运行目标代码来测试打算部署在目标硬件上的已编译的目标代码。要确定模型组件和生成的代码是否在数值上等效,请将GPU加速和PIL结果与普通模式结果进行比较。
PIL的目标连接配置
在运行PIL模拟之前,必须配置目标连通性。目标连接配置使PIL模拟能够:
构建目标应用程序。
下载、启动和停止目标上的应用程序。
金宝app支持Simulink之间的通信金宝app®还有目标。
为硬件平台(如NVIDIA)生成目标连接配置®DRIVE和Jetson,安装MATLAB®编码器™金宝appNVIDIA Jetson™和NVIDIA DRIVE™平台的支持包。
请注意
从R2021a开始,NVIDIA Jetson金宝app和NVIDIA DRIVE的MATLAB编码器支持包®平台被命名为MATLAB编码器金宝appNVIDIA Jetson和NVIDIA DRIVE平台的支持包。要在R2021a中使用此金宝app支持包,必须具有MATLAB编码器产品。
目标板要求
NVIDIA DRIVE或Jetson嵌入式平台。
用于连接目标板和主机PC的以太网交叉电缆(如果无法将目标板连接到本地网络)。
NVIDIA CUDA®单板上已安装Toolkit。
目标上用于编译器和库的环境变量。有关编译器、库及其设置的受支持版本的信息,请参金宝app见NVIDIA板的安装和设置先决条件(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包).
创建活动硬件连接对象
支持包软金宝app件使用TCP/IP上的SSH连接来执行命令,同时在DRIVE或Jetson平台上构建和运行生成的CUDA代码。将目标平台连接到与主机相同的网络中,或者使用以太网交叉电缆将单板直接连接到主机。有关如何设置和配置您的电路板,请参阅NVIDIA文档。
属性来创建活动硬件连接对象,以与NVIDIA硬件通信杰森
(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包)或开车
(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包)函数。使用该功能创建硬件活连接对象时,需要提供目标板的主机名或IP地址、用户名和密码。例如,为Jetson硬件创建活动对象:
Hwobj = jetson('192.168.1.15','ubuntu','ubuntu');
该软件执行硬件、编译器工具、库、IO服务器安装的检查,并收集目标的外围设备信息。该信息显示在“命令窗口”中。
检查目标上的CUDA可用性…正在检查目标系统路径中的NVCC…检查目标上的CUDNN库可用性…在目标上检查TensorRT库的可用性…检查先决条件库现在已经完成。获取硬件细节…获取硬件细节现在已经完成。显示详细信息。单板名称:NVIDIA Jetson TX2 CUDA版本:9.0 cuDNN版本:7.0 TensorRT版本:3.0可用网络摄像头:UVC摄像头(046d:0809)可用gpu: NVIDIA Tegra X2
或者,为DRIVE硬件创建活动对象:
Hwobj = drive('92.168.1.16','nvidia','nvidia');
请注意
如果连接失败,则在MATLAB命令窗口上报告诊断错误消息。如果连接失败,最可能的原因是IP地址或主机名错误。
示例:Mandelbrot集合
描述
曼德尔布罗特集是复平面上由这些值组成的区域z0由这个方程定义的轨迹在k→∞.
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顶模型
创建一个Simul金宝appink模型并插入一个MATLAB函数从用户定义函数图书馆。
双击MATLAB函数块。属性中出现默认函数签名MATLAB函数块编辑器。
定义一个函数
mandelbrot_count
,实现了Mandelbrot算法。函数头声明maxIterations
,xGrid
,yGrid
作为一个参数mandelbrot_count
函数,数
作为返回值。函数count = mandelbrot_count(maxIterations, xGrid, yGrid)% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));将计算映射到GPUcoder.gpu.kernelfun;Z = z0;为n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);
的块参数MATLAB函数块。在代码生成选项卡上,选择
可重用的功能
为函数包装参数。如果函数包装参数被设置为任何其他值,CUDA内核可能不会生成。
如图所示,把这些块连接起来。将模型另存为
mandelbrot_top.slx
.
配置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)所指明的极限之间xlim
而且ylim
.
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 =时间序列(500,0);xGrid =时间序列(xG,0);yGrid =时间序列(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(model,10);count_normal = sim_output.yout{1}.Values.Data(:,:,1);
运行一个顶层模型PIL仿真。
set_param(模型,“SimulationMode”,“Processor-in-the-Loop(公益诉讼)) sim_output = sim(model,10);count_pil = sim_output.yout {1} .Values.Data (:,: 1);
###目标设备不支持本机通信。金宝app正在检查连接配置注册…###生成代码到构建文件夹:/mathworks/examples/sil_pil/mandelbrot_top_ert_rtw ###为'mandelbrot_top'生成的代码是最新的,因为没有发现结构、参数或代码替换库更改。###使用工具链:NVCC for NVIDIA嵌入式处理器### '/mathworks/examples/sil_pil/mandelbrot_top_ert_rtw/mandelbrot_top。###正在构建“mandelbrot_top”:make -f mandelbrot_top。mkbuildobj ###成功完成构建过程:mandelbrot_top构建概要顶级模型目标构建:模型动作重建原因============================================================================= mandelbrot_top编译的代码编译工件已经过时。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 22.94 4s ###目标设备不支持本机通信。金宝app正在检查连接配置注册…组件“mandelbrot_top”的连接配置:NVIDIA Jetson的PIL执行正在使用端口17725。PIL执行使用30秒(s)接收超时。准备开始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 Set PIL”);轴从;
清理。
close_system(模型中,0);如果ishandle(图一),关闭(图一),结束清晰的图一simResults = {“count_sil”,“count_normal”,“模型”};保存([模型“_results”), simResults {:});明确(simResults {:},“simResults”)
限制
使用GPU Coder™的处理器在循环(PIL)金宝app模拟不支持mat文件日志记录。
另请参阅
功能
open_system
(金宝app模型)|load_system
(金宝app模型)|save_system
(金宝app模型)|close_system
(金宝app模型)|bdclose
(金宝app模型)|get_param
(金宝app模型)|set_param
(金宝app模型)|sim卡
(金宝app模型)|slbuild
(金宝app模型)