Проверьте правильность сгенерированного кода

После того, как вы генерируете код, графический процессор Coder™provides вы несколько опций, чтобы смотреть исходный код и протестировать правильность сгенерированного кода.

  • Отчет генерации кода обеспечивает интерактивный интерфейс для осмотра сгенерированных исходных файлов CUDA® C ++, сгенерированных типов данных и другого понимания кода. Для получения дополнительной информации см. Отчеты Генерации кода (MATLAB Coder).

  • Проверьте сгенерированные MEX-функции в приложении GPU Coder.

  • Проверьте сгенерированные MEX-функции в командной строке.

  • С Пакетом Поддержки GPU Coder для NVIDIA® графические процессоры можно использовать процессор в цикле (PIL) выполнение, чтобы проверять числовое поведение кода CUDA, который вы генерируете от функций MATLAB®. Для получения дополнительной информации смотрите Процессор В Выполнении Цикла из Командной строки (Пакет Поддержки GPU Coder для NVIDIA графические процессоры) и Процессор В Выполнении Цикла с Приложением GPU Coder (Пакет Поддержки GPU Coder для NVIDIA графические процессоры).

  • Если у вас есть Embedded Coder®, можно проверить числовое поведение сгенерированного Кода С++ CUDA при помощи программного обеспечения в цикле (SIL) выполнение.

Проверьте MEX-функции в приложении GPU Coder

В приложении 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-функции в командной строке

Можно проверить сгенерированный файл 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, скрипт или модульные тесты, основанные на классах.

Программное обеспечение Code Verification Through в цикле

GPU Coder поддерживает программное обеспечение в цикле (SIL) выполнение, которое позволяет вам проверить исходный код и скомпилированный объектный код. Во время выполнения SIL через интерфейс СИЛА MATLAB, компиляции программного обеспечения и использование тестовых векторов, которые вы обеспечиваете, код библиотеки запусков по вашему компьютеру разработчика. Можно снова использовать тестовые векторы, разработанные для функций MATLAB, чтобы проверить числовое поведение кода библиотеки.

Примечание

  • В системе Microsoft®Windows® Windows Firewall может потенциально блокировать выполнение SIL. Измените настройки Windows Firewall, чтобы предоставить доступ.

  • Для SIL на платформе Windows рекомендуется установить язык генерации кода на C++ вместо C.

  • При использовании выполнения SIL убедитесь что Benchmarking опцией в настройках GPU Coder является false. Выполнение SIL со сравнительным тестированием результатов в ошибках компиляции.

Выполнение СИЛА с приложением GPU Coder

Программное обеспечение в цикле (SIL) выполнение поддерживается только для статических и динамических типов библиотеки выход. Если бы вы сгенерировали MEX-функцию, необходимо изменить настройки проекта, чтобы использовать Static Library или Dynamic Library для Build type и запуска Generate code снова.

  1. Чтобы открыть приложение GPU Coder, на вкладке Apps панели инструментов MATLAB, под Code Generation, кликают по значку приложения.

  2. Чтобы открыть ваш проект, щелкните, и затем нажмите Open existing project. Выберите проект, myproject.prj. На странице Generate Code кликните по стреле Generate.

  3. В the Generate диалоговом окне:

    • Установите Build type на Static Library или Dynamic Library.

    • Снимите флажок Generate code only.

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

  4. Чтобы сгенерировать Код С++ CUDA, нажмите Generate. Нажмите Verify Code.

  5. В поле команды задайте тестовый файл (например, myfunction_test.m) это вызывает исходные функции MATLAB (например, myfunction).

  6. Чтобы запустить выполнение SIL, нажмите Run Generated Code. Coderapp графического процессора:

    • Генерирует автономную библиотеку в codegen\lib\myfunction.

    • Генерирует код интерфейса SIL в codegen\lib\myfunction\sil.

    • Запускает тестовый файл, заменяя вызовы функции MATLAB с вызовами сгенерированного кода в библиотеке.

    • Отображения обмениваются сообщениями от выполнения SIL во вкладке Test Output.

  7. Проверьте, что результаты выполнения SIL совпадают с результатами исходных функций MATLAB.

  8. Чтобы отключить процесс выполнения 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) С плавающей точкой выполняется вдвое более быстро по сравнению с двумя одной инструкциями, но приводит к потере числовой точности. Можно достигнуть более трудного управления этой оптимизацией при помощи флагов компилятора и встроенных функций. Смотрите GPU Coder Configuration Properties, чтобы использовать флаги компилятора и Интегрирование Унаследованного кода для использования внутренних параметров.