После того, как вы сгенерируете код, GPU Coder™ предоставляет вам несколько возможностей, чтобы смотреть исходный код и протестировать правильность сгенерированного кода.
Отчет генерации кода обеспечивает интерактивный интерфейс для осмотра сгенерированных исходных файлов CUDA®, сгенерированных типов данных и другого понимания кода. Для получения дополнительной информации см. Отчеты Генерации кода.
Проверьте сгенерированные MEX-функции в приложении GPU Coder.
Проверьте сгенерированные MEX-функции в командной строке.
С MATLAB® Coder™ Support Package для NVIDIA® Jetson и Платформ ДИСКА NVIDIA, можно использовать процессор в цикле (PIL) выполнение, чтобы проверять числовое поведение кода CUDA, который вы генерируете от функций MATLAB. Для получения дополнительной информации смотрите Процессор В Выполнении Цикла из Командной строки (Пакет Поддержки MATLAB Coder для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами) и Процессор В Выполнении Цикла с Приложением GPU Coder (Пакет Поддержки MATLAB Coder для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами).
Если у вас есть 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 результатами выполнения сгенерированной MEX-функции CUDA.
Можно проверить сгенерированный файл MEX CUDA в командной строке при помощи coder.runTest
функция. 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, компиляции программного обеспечения и использование тестовых векторов, которые вы обеспечиваете, код библиотеки запусков по вашему компьютеру разработчика. Можно снова использовать тестовые векторы, разработанные для функций MATLAB, чтобы проверить числовое поведение кода библиотеки.
Примечание
В системе Microsoft® Windows® Windows Firewall может потенциально блокировать выполнение SIL. Измените настройки Windows Firewall, чтобы предоставить доступ.
При использовании выполнения SIL убедитесь что Benchmarking
опцией в настройках GPU Coder является false
. Выполнение SIL со сравнительным тестированием результатов в ошибках компиляции.
Программное обеспечение в цикле (SIL) выполнение поддерживается только для статических и динамических типов библиотеки выход. Если бы вы сгенерировали MEX-функцию, необходимо изменить настройки проекта, чтобы использовать Static Library
или Dynamic Library
для Build type и запуска Generate code снова.
Чтобы открыть приложение GPU Coder, на вкладке Apps панели инструментов MATLAB, под Code Generation, кликают по значку приложения.
Чтобы открыть ваш проект, щелкните, и затем нажмите Open existing project
. Выберите проект, myproject.prj
. На странице Generate Code кликните по стреле Generate.
В the 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, смотрите Интегрирование Унаследованного кода.