Численная проверка эквивалентности

Тестируйте числовую эквивалентность между компонентами модели и производственным кодом, которые вы генерируете из компонентов, используя симуляции ускорения графический процессор и процессора в цикле (PIL).

С помощью симуляции ускорения графический процессор, вы тестируете исходный код на вашем компьютере разработчика. С помощью PIL симуляции вы тестируете скомпилированный код объекта, который вы намерены развернуть на целевой компьютер, запустив код объекта на реальном целевом компьютере. Чтобы определить, являются ли компоненты модели и сгенерированный код численно эквивалентными, сравните результаты графического процессора ускорения и PIL с режимом normal mode результатами.

Целевые Строения подключения для PIL

Прежде чем вы сможете запустить PIL симуляции, необходимо сконфигурировать целевое подключение. Целевое строение подключения позволяет PIL симуляции:

  • Создайте целевое приложение.

  • Загрузите, запустите и остановите приложение на цели.

  • Поддерживайте коммуникацию между Simulink® и цель.

Создание целевого строения подключения для аппаратных платформ, таких как NVIDIA® DRIVE и Jetson, установите MATLAB® Coder™ поддержки для NVIDIA Jetson® и платформы DRIVE™ NVIDIA.

Примечание

Начиная с R2021a, GPU Coder™ Support Package for NVIDIA GPU называется MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms. Чтобы использовать этот пакет поддержки в R2021a, вы должны иметь продукт MATLAB Coder.

Требования к целевой плате

  • NVIDIA DRIVE или встроенная платформа Jetson.

  • Перекрестный кабель Ethernet для подключения целевой платы и хост-ПК (если вы не можете подключить целевую плату к локальной сети).

  • NVIDIA CUDA® тулкит, установленный на плате.

  • Переменные окружения целевого компьютера для компиляторов и библиотек. Дополнительные сведения о поддерживаемых версиях компиляторов, библиотек и их настройке см. в разделе Предварительные необходимые условия установки и Setup плат NVIDIA (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE).

Создайте объект Оборудование Connection

Программное обеспечение пакета поддержки использует SSH-соединение через TCP/IP для выполнения команд во время создания и выполнения сгенерированного кода CUDA на платформах DRIVE или Jetson. Подключите целевую платформу к той же сети, что и хосту-компьютеру, или используйте перекрестный кабель Ethernet, чтобы подключить плату непосредственно к хосту-компьютеру. Для настройки и настройки системной платы см. документацию NVIDIA.

Для связи с оборудованием NVIDIA создайте объект live hardware connection при помощи jetson(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) или drive (MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms). Чтобы создать объект подключения к оборудованию при помощи функции, укажите имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Для примера, чтобы создать объект live для оборудования Jetson:

hwobj = jetson('192.168.1.15','ubuntu','ubuntu');

Программа выполняет проверку оборудования, инструментов компилятора, библиотек, установки сервера ввода-вывода и собирает периферийную информацию о цели. Эта информация отображается в Командном окне.

Checking for CUDA availability on the Target...
Checking for NVCC in the target system path...
Checking for CUDNN library availability on the Target...
Checking for TensorRT library availability on the Target...
Checking for Prerequisite libraries is now complete.
Fetching hardware details...
Fetching hardware details is now complete. Displaying details.
 Board name        : NVIDIA Jetson TX2
 CUDA Version      : 9.0
 cuDNN Version     : 7.0
 TensorRT Version  : 3.0
 Available Webcams : UVC Camera (046d:0809)
 Available GPUs    : NVIDIA Tegra X2

Кроме того, чтобы создать объект live для оборудования DRIVE:

hwobj = drive('92.168.1.16','nvidia','nvidia');

Примечание

В случае отказа соединения в командном окне MATLAB выводится сообщение об ошибке диагностики. Если подключение не удалось, наиболее вероятной причиной является неправильный IP-адрес или имя узла.

Пример: Набор Мандельброта

Описание

Набор Мандельброта является областью в комплексной плоскости, состоящей из значений z 0, для которых траектории, заданные этим уравнением, остаются ограниченными при k→∞.

zk+1=zk2+z0,k=0,1,

Общая геометрия набора Мандельброта показана на рисунке. Это представление не имеет разрешения, чтобы показать богато детализированную структуру бахромы непосредственно за границей набора. При увеличении увеличения набор Мандельброта показывает сложный контур, которая обнаруживает постепенно более мелкие рекурсивные детали.

Geometry of the Mandelbrot set

Алгоритм

Для этого руководства выберите набор пределов, которые задают сильно увеличенную часть набора Мандельброта в овраге между основным кардиоидом и p/q луковицей налево. Между этими двумя пределами создается сетка 1000 на 1000 действительных частей (x) и мнимых частей (y). Алгоритм Мандельброта затем итератируется в каждом местоположении сетки. Значение итерации 500 отображает изображение в полном разрешении.

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

В этом руководстве используется реализация набора Mandelbrot с помощью стандартных команд MATLAB, выполняемых на центральном процессоре. Это вычисление векторизировано таким образом, что каждое местоположение обновляется одновременно.

Ускорение графического процессора или PIL симуляции с Верхней частью моделью

Протестируйте сгенерированный код модели, запустив PIL симуляцию верхней модели. С помощью этого подхода:

  • Вы тестируете код, сгенерированный из верхней модели, которая использует автономный интерфейс кода.

  • Вы конфигурируете модель, чтобы загрузить тестовые векторы или входные входы стимула из рабочего пространства MATLAB.

  • Можно легко переключить верхнюю модель между нормальным, ускорением графического процессора и режимами PIL симуляции.

Создайте верхнюю модель Мандельброта

  1. Создайте модель Simulink и вставьте блок MATLAB Function из библиотеки User-Defined Functions.

  2. Дважды кликните MATLAB Function блок. Сигнатура функции по умолчанию появится в редакторе блоков MATLAB Function.

  3. Задайте функцию, называемую mandelbrot_count, который реализует алгоритм Мандельброта. Заголовок функции объявляет maxIterations, xGrid, и yGrid как аргумент к mandelbrot_count функция, с count как возврат значение.

    function count = mandelbrot_count(maxIterations, xGrid, yGrid)
    % mandelbrot computation
    
    z0 = xGrid + 1i*yGrid;
    count = ones(size(z0));
    
    % Map computation to GPU
    coder.gpu.kernelfun;
    
    z = z0;
    for n = 0:maxIterations
        z = z.*z + z0;
        inside = abs(z)<=2;
        count = count + inside;
    end
    count = log(count);
    

  4. Откройте параметры блоков MATLAB Function. На вкладке Code Generation выберите Reusable function для Function packaging параметра.

    Если для параметра Function packaging задано любое другое значение, ядра CUDA могут не сгенерироваться.

  5. Добавьте Inport (Simulink) блоки и Outport (Simulink) блок из библиотеки Sources и Sinks.

  6. Соедините эти блоки как показано на схеме. Сохраните модель как mandelbrot_top.slx.

    Simulink model showing connection between the blocks.

Сконфигурируйте модель для ускорения графического процессора

Чтобы сосредоточиться на численной проверке эквивалентности, отключите:

  • Покрытие модели

  • Покрытие кода

  • Профилирование времени выполнения

model = 'mandelbrot_top';
close_system(model,0);
open_system(model)
set_param(gcs, 'RecordCoverage','off');
coverageSettings = get_param(model, 'CodeCoverageSettings');
coverageSettings.CoverageTool='None';
set_param(model, 'CodeCoverageSettings',coverageSettings);
set_param(model, 'CodeExecutionProfiling','off');

Сконфигурируйте входные данные стимула. Следующие строки кода генерируют сетку 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 = timeseries(500,0);
xGrid = timeseries(xG,0);
yGrid = timeseries(yG,0);

Сконфигурируйте опции регистрации в модели.

set_param(model, 'LoadExternalInput','on');
set_param(model, 'ExternalInput','maxIterations, xGrid, yGrid');
set_param(model, 'SignalLogging', 'on');
set_param(model, 'SignalLoggingName', 'logsOut');
set_param(model, 'SaveOutput','on')

Запуск Normal и PIL симуляций

Запустите симуляцию режима normal mode.

set_param(model,'SimulationMode','normal')
set_param(model,'GPUAcceleration','on');
sim_output = sim(model,10);
count_normal = sim_output.yout{1}.Values.Data(:,:,1);

Запустите PIL симуляцию топовой модели.

set_param(model,'SimulationMode','Processor-in-the-Loop (PIL)')
sim_output = sim(model,10);
count_pil = sim_output.yout{1}.Values.Data(:,:,1);
### Target device has no native communication support.
Checking connectivity configuration registrations...
### Starting build procedure for: mandelbrot_top
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: 
/mathworks/examples/sil_pil/mandelbrot_top_ert_rtw
### Generated code for 'mandelbrot_top' is up to date because no structural, 
parameter or code replacement library changes were found.
### Evaluating PostCodeGenCommand specified in the model
### Using toolchain: NVCC for NVIDIA Embedded Processors
### '/mathworks/examples/sil_pil/mandelbrot_top_ert_rtw/mandelbrot_top.mk' is 
up to date
### Building 'mandelbrot_top': make  -f mandelbrot_top.mk buildobj
### Successful completion of build procedure for: mandelbrot_top

Build Summary

Top model targets built:

Model                Action         Rebuild Reason                           
=============================================================================
mandelbrot_top  Code compiled  Compilation artifacts were out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 22.94s
### Target device has no native communication support. Checking connectivity 
configuration registrations...
### Connectivity configuration for component "mandelbrot_top": NVIDIA Jetson ###
PIL execution is using Port 17725.
PIL execution is using 30 Sec(s) for receive time-out.
### Preparing to start PIL simulation ...
### 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 симуляций. Заметьте, что результаты совпадают.

figure();
subplot(1,2,1)
imagesc(x, y, count_normal);
colormap([jet();flipud( jet() );0 0 0]);
title('Mandelbrot Set Normal Simulation');
axis off;

subplot(1,2,2)
imagesc(x, y, count_pil);
colormap([jet();flipud( jet() );0 0 0]);
title('Mandelbrot Set PIL');
axis off;

Mandelbrot set output from normal and PIL simulations

Очистить.

close_system(model,0);
if ishandle(fig1), close(fig1), end
clear fig1
simResults = {'count_sil','count_normal','model'};
save([model '_results'],simResults{:});
clear(simResults{:},'simResults')

Ограничения

Логгирование MAT-файлов не поддерживается для симуляции процессора в цикле (PIL) с GPU Coder.

См. также

Функции

Похожие темы