После создания кода графический процессор Coder™ предоставляет несколько опций для проверки исходного кода и проверки правильности созданного кода.
Отчет о создании кода предоставляет интерактивный интерфейс для проверки созданных исходных файлов CUDA ®, созданных типов данных и другой информации о коде. Дополнительные сведения см. в разделе Отчеты по созданию кода.
Проверьте созданные функции MEX в приложении GPU Coder.
Проверьте созданные функции MEX в командной строке.
С помощью пакета Coder™ поддержки MATLAB ® для платформ NVIDIA ® Jetson и NVIDIA DRIVE можно использовать выполнение процессора в цикле (PIL) для проверки численного поведения кода CUDA, генерируемого из функций MATLAB. Дополнительные сведения см. в разделе Выполнение процессора в цикле из командной строки (пакет поддержки кодера MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) и Выполнение процессора в цикле с помощью приложения кодера GPU (поддержка кодера MATLAB
Если вы используете Embedded Coder ®, вы можете проверить числовое поведение созданного кода CUDA с помощью выполнения программного обеспечения в цикле (SIL).
После создания функции MEX в приложении GPU Coder можно проверить, что она обладает теми же функциями, что и исходная функция начального уровня MATLAB. Предоставьте тестовый файл, который генерирует векторы тестирования для тестируемой функции, а затем вызывает исходную функцию точки входа MATLAB. Тестовый файл может быть функцией или сценарием MATLAB, но должен находиться в той же папке, что и исходная функция точки входа.
На странице Создать код приложения Кодер графического процессора щелкните Проверить код.
Введите или выберите тестовый файл. Например, myfunction_test.
Чтобы запустить тестовый файл без замены вызовов исходной функции MATLAB вызовами функции MEX, выберите код MATLAB для опции Run using. Щелкните Выполнить сгенерированный код.
Чтобы запустить тестовый файл, заменив вызовы исходной функции MATLAB вызовами функции MEX, выберите Generated code для опции Run using. Щелкните Выполнить сгенерированный код.
Сравните результаты выполнения исходной функции MATLAB с результатами выполнения созданной функции CUDA MEX.
Можно проверить созданный файл CUDA MEX в командной строке с помощью 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 SIL программное обеспечение компилирует и, используя предоставленные тестовые векторы, запускает библиотечный код на компьютере разработчика. Для проверки числового поведения кода библиотеки можно повторно использовать тестовые векторы, разработанные для функций MATLAB.
Примечание
В системе Microsoft ® Windows ® брандмауэр Windows потенциально может блокировать выполнение SIL. Измените параметры брандмауэра Windows, чтобы разрешить доступ.
При использовании SIL убедитесь, что Benchmarking параметр в настройках кодера графического процессора: false. Выполнение SIL с бенчмаркингом приводит к ошибкам компиляции.
Выполнение программного обеспечения в цикле (SIL) поддерживается только для статических и динамических типов вывода библиотеки. При создании функции MEX необходимо изменить параметры проекта для использования Static Library или Dynamic Library для типа построения и снова запустите Generate code.
Чтобы открыть приложение GPU Coder, на вкладке MATLAB toolstrip Apps в разделе Code Generation щелкните значок приложения.
Чтобы открыть проект, нажмите,
а затем нажмите Open existing project. Выберите проект, myproject.prj. На странице «Создать код» щелкните стрелку «Создать».![]()
В диалоговом окне «Создание» выполните следующие действия.
Задать для типа построения значение Static Library или Dynamic Library.
Снимите флажок Только генерировать код.
Можно оставить другие параметры настройки значениями по умолчанию.
Для создания кода CUDA нажмите кнопку «Создать». Щелкните Проверить код.
В поле команды укажите тестовый файл (например, myfunction_test.m), которая вызывает исходные функции MATLAB (например, myfunction).
Чтобы запустить выполнение SIL, щелкните Выполнить сгенерированный код. Приложение Кодер графического процессора:
Создает автономную библиотеку в codegen\lib\myfunction.
Генерирует код интерфейса SIL в codegen\lib\myfunction\sil.
Запускает тестовый файл, заменяя вызовы функции MATLAB вызовами сгенерированного кода в библиотеке.
Отображает сообщения о выполнении SIL на вкладке Test Output.
Убедитесь, что результаты выполнения SIL соответствуют результатам исходных функций MATLAB.
Чтобы завершить процесс выполнения SIL, щелкните Остановить проверку SIL. Либо на вкладке Test Output щелкните следующую ссылку. To terminate execution.
Чтобы настроить и запустить выполнение SIL из командной строки, создайте объект конфигурации кодера графического процессора для генерации кода библиотеки, включите 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;
Из-за архитектурных различий между CPU и GPU числовая проверка не всегда совпадает. Этот сценарий особенно верен при использовании single тип данных в коде MATLAB и выполнение операций накопления для них single значения типа данных. Однако есть случаи, подобные примеру Мандельброта, где даже double типы данных вызывают числовые ошибки. Одна из причин этого несоответствия заключается в том, что блоки графического процессора с плавающей запятой используют плавающие команды умножения-сложения с плавающей запятой (FMAD), в то время как ЦП не использует эти команды. Также важно отметить, что компилятор CUDA выполняет эти оптимизации на уровне команд по умолчанию, влияя на точность вычисленных результатов. Например, компилятор CUDA плавает с плавающей запятой и добавляет команды в одну команду. Эта операция умножения с плавающей запятой (FMAD) выполняется вдвое быстрее по сравнению с двумя одиночными командами, но приводит к потере численной точности. Можно добиться более жесткого контроля над этими оптимизациями с помощью собственных функций и флагов компилятора. Чтобы установить флаги компилятора, см. раздел coder.gpuConfig. Сведения об интеграции встроенных функций CUDA см. в разделе Интеграция устаревшего кода.