exponenta event banner

Проверка численной эквивалентности

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

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

Конфигурация целевого подключения для PIL

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

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

  • Загрузите, запустите и остановите приложение на конечном объекте.

  • Поддержка связи между Simulink ® и целевой системой.

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

Примечание

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

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

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

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

  • Набор инструментов NVIDIA CUDA ®, установленный на системной плате.

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

Создать объект аппаратного подключения в реальном времени

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

Для связи с аппаратным обеспечением NVIDIA создайте объект подключения аппаратного обеспечения в реальном времени с помощью jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) или drive(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE). Для создания объекта аппаратного соединения в режиме реального времени с помощью этой функции укажите имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, чтобы создать живой объект для оборудования 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

Кроме того, чтобы создать живой объект для оборудования DRIVE, выполните следующие действия.

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

Примечание

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

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

Описание

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

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

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

Geometry of the Mandelbrot set

Алгоритм

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

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

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

Ускорение графического процессора или моделирование PIL с использованием верхней модели

Проверьте созданный код модели, запустив моделирование PIL верхней модели. При таком подходе:

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

  • Модель настраивается для загрузки тестовых векторов или входных сигналов стимула из рабочей области MATLAB.

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

Создать верхнюю модель Mandelbrot

  1. Создайте модель Simulink и вставьте блок MATLAB Function из библиотеки пользовательских функций.

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

  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. На вкладке Создание кода выберите Reusable function для параметра упаковки функций.

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

  5. Добавьте блоки Inport (Simulink) и Outport (Simulink) из библиотеки Sources and 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');

Сконфигурируйте входные данные стимула. Следующие строки кода генерируют сетку из вещественных частей (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')

Выполнение нормального моделирования и моделирования PIL

Выполните моделирование в обычном режиме.

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) с помощью кодера графического процессора.

См. также

Функции

Связанные темы