Графический процессор Coder™provides вы несколько опций, чтобы протестировать правильность сгенерированного кода.
Проверьте сгенерированные MEX-функции в приложении GPU Coder.
Проверьте сгенерированные MEX-функции в командной строке.
Если у вас есть Embedded Coder®, можно проверить числовое поведение сгенерированного кода C/C++ при помощи программного обеспечения в цикле (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 на платформе Windows рекомендуется установить язык генерации кода на C++ вместо C.
При использовании выполнения SIL убедитесь, что опцией Benchmarking
в настройках GPU Coder является false
. Выполнение SIL со сравнительным тестированием результатов в ошибках компиляции.
Программное обеспечение в цикле (SIL) выполнение поддерживается только для static library
и dynamic library
типы вывода. Если бы вы сгенерировали MEX-функцию, необходимо изменить настройки проекта, чтобы пользоваться библиотекой static
или dynamic
для 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.
Можно оставить другие настройки их значениям по умолчанию.
Чтобы сгенерировать C или Код С++, нажмите Generate. Нажмите Verify Code.
В поле команды задайте тестовый файл (например, myfunction_test.m
), который вызывает исходные функции MATLAB (например, myfunction
).
Чтобы запустить выполнение SIL, нажмите Run Generated Code. Coderapp графического процессора:
Генерирует автономную библиотеку в 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) С плавающей точкой выполняется вдвое более быстро по сравнению с двумя одной инструкциями, но приводит к потере числовой точности. Можно достигнуть более трудного управления этой оптимизацией при помощи флагов компилятора и встроенных функций. Смотрите GPU Coder Configuration Properties, чтобы использовать флаги компилятора и Интегрирование Унаследованного кода для использования intrinsics.