После того, как вы сгенерируете код, GPU Coder™ предоставляет вам несколько опций, чтобы проверить исходный код и проверить правильность сгенерированного кода.
Отчет генерации кода предоставляет интерактивный интерфейс для проверки сгенерированного CUDA® исходные файлы, сгенерированные типы данных и другие сведения о коде. Для получения дополнительной информации см. Отчеты генерации кода.
Проверьте сгенерированные MEX-функции в приложении GPU Coder.
Проверьте сгенерированные MEX-функции в командной строке.
С MATLAB® Coder™ поддержки для NVIDIA® Платформы Jetson и NVIDIA DRIVE, можно использовать выполнение процессора в цикле (PIL), чтобы проверить численное поведение кода CUDA, который вы генерируете из функций MATLAB. Для получения дополнительной информации смотрите Выполнение процессора в цикле из командной строки (MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms) и Выполнение процессора в цикле с помощью приложения GPU Coder App (
Если у вас есть Embedded Coder®можно проверить численное поведение сгенерированного кода CUDA с помощью выполнения программы в цикле (SIL).
В приложении GPU Coder после того, как вы сгенерируете MEX-функцию, можно проверить, что она имеет ту же функциональность, что и исходная функция точки входа MATLAB. Предоставьте тестовый файл, который генерирует тестовые векторы для тестируемой функции и затем вызывает исходную функцию точки входа MATLAB. Тестовый файл может быть функцией MATLAB или скриптом, но должен находиться в той же папке, что и исходная функция точки входа.
На Generate Code странице приложения GPU Coder нажмите Verify Code.
Введите или выберите тестовый файл. Для примера, myfunction_test
.
Чтобы запустить тестовый файл без замены вызовов исходной функции MATLAB вызовами MEX-функции, выберите MATLAB code для опции Run using. Нажмите Run Generated Code.
Чтобы запустить тестовый файл, заменив вызовы исходной функции MATLAB вызовами MEX-функции, выберите Generated code для опции Run using. Нажмите Run Generated Code.
Сравните результаты выполнения исходной функции MATLAB с результатами выполнения сгенерированной функции CUDA MEX.
Можно проверить сгенерированный файл CUDA MEX в командной строке, используя coder.runTest
функция. The coder.runTest
функция запускает тестовый файл путем замены вызовов исходной функции MATLAB вызовами MEX-функции. Для примера, чтобы протестировать myfunction
функция со myfunction_test
тестовый файл, введите следующий код в Командное окно MATLAB.
coder.runTest('myfunction_test','myfunction')
Сравните результаты с результатами выполнения исходной функции MATLAB. Если во время запуска возникают ошибки, для отладки доступна информация о стеке вызовов. Также можно использовать codegen
с -test
опция.
codegen myfunction -test'myfunction_test'
Тестовым файлом может быть функция MATLAB, скрипт или модульные тесты , основанный на классах.
GPU Coder поддерживает выполнение программы в цикле (SIL), что позволяет проверять исходный код и скомпилированные объектные коды. Во время выполнения SIL через интерфейс MATLAB SIL, программное обеспечение компилирует и с помощью тестовых векторов, которые вы предоставляете, запускает библиотечный код на вашем компьютере разработчика. Можно повторно использовать тестовые векторы, разработанные для функций MATLAB, чтобы проверить численное поведение кода библиотеки.
Примечание
On a Microsoft® Windows® система, брандмауэр Windows может потенциально заблокировать выполнение SIL. Измените параметры брандмауэра Windows, чтобы разрешить доступ.
При использовании выполнения SIL убедитесь, что Benchmarking
опция в настройках GPU Coder false
. Выполнение SIL с тестированием приводит к ошибкам компиляции.
Выполнение программы в цикле (SIL) поддерживается только для статических и динамических выходов библиотеки. Если вы сгенерировали MEX-функцию, необходимо изменить настройки проекта, чтобы использовать Static Library
или Dynamic Library
для Build type и запуска Generate code снова.
Чтобы открыть приложение GPU Coder, на вкладке Apps панель инструментов, в разделе Code Generation, щелкните значок приложения.
Чтобы открыть свой проект, нажмите, а затем нажмите Open existing project
. Выберите проект, myproject.prj
. На странице Generate Code щелкните стрелу Generate.
В диалоговом окне Generate :
Установите Build type значение Static Library
или Dynamic Library
.
Снимите флажок Generate code only.
Другие настройки можно оставить значениями по умолчанию.
Чтобы сгенерировать код CUDA, нажмите Generate. Нажмите Verify Code.
В поле команды укажите тестовый файл (для примера, myfunction_test.m
), который вызывает исходные функции MATLAB (для примера, myfunction
).
Чтобы начать выполнение SIL, нажмите Run Generated Code. Приложение GPU Coder:
Создает автономную библиотеку в codegen\lib\myfunction
.
Генерирует код интерфейса SIL в codegen\lib\myfunction\sil
.
Запускает тестовый файл, заменяя вызовы функции MATLAB вызовами сгенерированного кода в библиотеке.
Отображает сообщения от выполнения SIL на вкладке Test Output.
Проверьте, что результаты выполнения SIL совпадают с результатами исходных функций MATLAB.
Чтобы завершить процесс выполнения SIL, нажмите Stop SIL Verification. Кроме того, на вкладке Test Output щелкните ссылку, которая следует To terminate execution
.
Чтобы настроить и запустить выполнение SIL из командной строки, вы создаете объект строения GPU Coder для генерации кода библиотеки, включите config_obj.VerificationMode = 'SIL'
, использовать codegen
функция для генерации кода библиотеки и интерфейса SIL и использования coder.runTest
функция для запуска тестового файла для исходной функции MATLAB. Ниже представлен скрипт сборки, который автоматизирует серию команд для выполнения выполнения SIL.
%% Create configuration object for static library. config = coder.gpuConfig('lib'); config.GenerateReport = true; config.VerificationMode = 'SIL'; %% Define argument types for entry-point 'mandelbrot_count'. ARGS = cell(1,1); ARGS{1} = cell(3,1); ARGS{1}{1} = coder.typeof(0); ARGS{1}{2} = coder.typeof(0,[1000 1000]); ARGS{1}{3} = coder.typeof(0,[1000 1000]); %% Invoke GPU Coder. codegen -config config myfunction -args ARGS{1} %% Run the test file with the sil interface coder.runTest('myfunction_test', ['myfunction_sil.' mexext]); %% Terminate SIL execution clear myfunction_sil;
Из-за архитектурных различий между центральным процессором и графическим процессором числовая верификация не всегда совпадает. Этот сценарий особенно верен при использовании single
тип данных в коде MATLAB и выполнение операций накопления на этих single
значения типа данных. Однако существуют случаи, подобные примеру Мандельброта, где даже double
типы данных вызывают числовые ошибки. Одной из причин этого несоответствия является то, что графические процессоры модулей с плавающей точкой используют слитые инструкции FMAD, в то время как центральный процессор не использует эти инструкции. Также важно отметить, что компилятор CUDA выполняет эти оптимизации уровня команд по умолчанию, влияя на точность вычисленных результатов. Например, компилятор CUDA плавает с плавающей точкой умножить и добавить инструкции в одну инструкцию. Эта операция Multiply-Add (FMAD) с плавающей точкой выполняется вдвое быстрее по сравнению с двумя отдельными инструкциями, но приводит к потере числовой точности. Вы можете добиться более жесткого контроля над этими оптимизациями с помощью внутренних функций и флагов компилятора. Для установки флагов компилятора смотрите coder.gpuConfig
. Для интеграции внутренностей CUDA смотрите Унаследованный код Интегрирования.