Самый простой способ создать ядра CUDA ® - разместить coder.gpu.kernelfun pragma в основную функцию MATLAB ®. Основная функция также известна как функция верхнего уровня или начального уровня. Когда графический процессор Coder™ сталкивается сkernelfun pragma пытается распараллелить все вычисления в рамках этой функции, а затем отображает их в графический процессор. Дополнительные сведения о ядрах GPU см. в разделе Парадигма программирования GPU.
В этом учебном пособии вы узнаете, как:
Подготовьте код MATLAB для создания кода CUDA с помощью kernelfun прагматика.
Создайте и настройте проект кодера графического процессора.
Определите свойства ввода функции.
Проверьте готовность к созданию кода и проблемы времени выполнения.
Укажите свойства создания кода.
Создайте код CUDA с помощью приложения GPU Coder.
Для этого учебного пособия требуются следующие продукты:
MATLAB
MATLAB Coder™
Кодер графического процессора
Компилятор C++
Графический процессор NVIDIA ® с поддержкой CUDA
Набор инструментов и драйвер CUDA
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделе Переменные среды.
Множество Мандельброта - это область в комплексной плоскости, состоящая из значений z0, для которых траектории, определенные этим уравнением, остаются ограниченными в k→∞.
0, 1,...
Общая геометрия набора Мандельброта показана на рисунке. Этот вид не имеет разрешения, чтобы показать богато детализированную структуру цветовых полей непосредственно за границей набора. При увеличении увеличений набор Мандельброта показывает сложную границу, которая показывает постепенно более тонкую рекурсивную деталь.

В этом учебном пособии выберите набор пределов, определяющих сильно увеличенную часть набора Мандельброта в долине между основным кардиоидом и лампочкой p/q слева от него. Между этими двумя пределами создается сетка из вещественных частей (x) и мнимых частей (y) размером 1000 на 1000. Алгоритм Мандельброта затем итерируется в каждом местоположении сетки. Число итераций 500 позволяет визуализировать изображение в полном разрешении.
maxIterations = 500; gridSize = 1000; xlim = [-0.748766713922161,-0.748766707771757]; ylim = [0.123640844894862,0.123640851045266];
В этом учебном пособии используется реализация набора Mandelbrot с использованием стандартных команд MATLAB, выполняемых на CPU. Этот расчет векторизируется таким образом, что каждое местоположение обновляется одновременно.
Создание функции MATLAB с именем mandelbrot_count.m со следующими строками кода. Этот код является базовой векторизированной реализацией MATLAB набора Мандельброта. Для каждой точки (xGrid,yGrid) в сетке вычисляется индекс итерации count при которой траектория, определенная уравнением, достигает расстояния 2 от происхождения. Затем возвращается натуральный логарифм count, который используется для генерации цветокодированного графика набора Мандельброта. Далее в этом учебном пособии этот файл будет изменен, чтобы сделать его пригодным для создания кода.
function count = mandelbrot_count(maxIterations,xGrid,yGrid) % mandelbrot computation z0 = xGrid + 1i*yGrid; count = ones(size(z0)); z = z0; for n = 0:maxIterations z = z.*z + z0; inside = abs(z)<=2; count = count + inside; end count = log(count);
Создание сценария MATLAB с именем mandelbrot_test.m со следующими строками кода. Сценарий создает сетку 1000 на 1000 вещественных частей (x) и мнимых частей (y) между пределами, указанными xlim и ylim. Он также вызывает mandelbrot_count и строит график результирующего набора Мандельброта.
maxIterations = 500; gridSize = 1000; xlim = [-0.748766713922161,-0.748766707771757]; ylim = [0.123640844894862,0.123640851045266]; x = linspace(xlim(1),xlim(2),gridSize); y = linspace(ylim(1),ylim(2),gridSize); [xGrid,yGrid] = meshgrid(x,y); %% Mandelbrot computation in MATLAB count = mandelbrot_count(maxIterations,xGrid,yGrid); % Show figure(1) imagesc(x,y,count); colormap([jet();flipud(jet());0 0 0]); axis off title('Mandelbrot set with MATLAB');
Прежде чем сделать версию MATLAB алгоритма набора Мандельброта подходящей для генерации кода, можно проверить функциональность исходного кода.
Измените текущую рабочую папку MATLAB на расположение, которое содержит mandelbrot_count.m и mandelbrot_test.m. Кодер графического процессора помещает созданный код в эту папку. Измените текущую рабочую папку, если у вас нет полного доступа к этой папке.
Запустить mandelbrot_test сценарий.
Сценарий тестирования выполняется и отображает геометрию мандельброта в пределах границы, заданной переменными. xlim и ylim.

Перед созданием кода с помощью кодера графического процессора проверьте наличие проблем с кодированием в исходном коде MATLAB.
Существует два инструмента, которые помогают обнаружить проблемы создания кода во время разработки:
Анализатор кода
Средство готовности к созданию кода
Анализатор кода - это инструмент, встроенный в редактор MATLAB, который непрерывно проверяет код при его вводе. Анализатор кода сообщает о проблемах и рекомендует изменения, чтобы максимизировать производительность и ремонтопригодность кода. Чтобы определить предупреждения и ошибки, специфичные для создания кода из кода MATLAB, добавьте %#codegen директиву к файлу MATLAB. Дополнительные сведения см. в разделе Настройки анализатора кода.
Примечание
Анализатор кода не обнаруживает всех проблем с генерацией кода. После устранения ошибок или предупреждений, обнаруженных анализатором кода, скомпилируйте код с помощью кодера графического процессора, чтобы определить наличие других проблем с соответствием.
Инструмент готовности к созданию кода отображает код MATLAB для функций и функций, которые не поддерживаются для создания кода. Этот инструмент предоставляет отчет, в котором перечислены проблемы и рекомендации по созданию кода MATLAB, подходящего для создания кода. Доступ к инструменту готовности к созданию кода можно получить следующими способами:
В текущем браузере папок щелкните правой кнопкой мыши файл MATLAB, содержащий функцию точки входа.
В командной строке - с помощью coder.screener функции с помощью -gpu флаг.
В приложении GPU Coder - после указания файлов точек входа приложение запускает анализатор кода и инструмент готовности к созданию кода.
Кодер графического процессора можно использовать для проверки проблем во время создания кода. Когда кодер графического процессора обнаруживает ошибки или предупреждения, он генерирует отчет об ошибках, который описывает проблемы и предоставляет ссылки на проблемный код MATLAB. Дополнительные сведения см. в разделе Отчеты по созданию кода.
Чтобы начать процесс создания кода MATLAB для создания кода, используйте файл mandelbrot_count.m.
Установите текущую папку MATLAB в рабочую папку, содержащую файлы для данного учебного пособия.
В редакторе MATLAB откройте mandelbrot_count.m. Индикатор сообщения Code Analyzer в правом верхнем углу редактора MATLAB имеет зеленый цвет. Анализатор не обнаружил ошибок, предупреждений или возможностей для улучшения кода.
После объявления функции добавьте %#codegen директива для включения проверки ошибок, характерных для генерации кода.
function count = mandelbrot_count(maxIterations,xGrid,yGrid) %#codegen
Индикатор сообщения анализатора кода остается зеленым, что указывает на то, что он не обнаружил проблем с генерацией кода.
Для отображения mandelbrot_count в ядро CUDA, измените исходный код MATLAB, разместив coder.gpu.kernelfun прагматика в теле функции.
function count = mandelbrot_count(maxIterations,xGrid,yGrid) %#codegen % Add kernelfun pragma to trigger kernel creation coder.gpu.kernelfun; % mandelbrot computation z0 = xGrid + 1i*yGrid; count = ones(size(z0)); z = z0; for n = 0:maxIterations z = z.*z + z0; inside = abs(z)<=2; count = count + inside; end count = log(count);
Если вы используете coder.gpu.kernelfun pragma, GPU Coder пытается отобразить вычисления в функции mandelbrot_count в ГПУ.
Сохраните файл. Теперь вы готовы к компиляции кода с помощью приложения GPU Coder.
На вкладке Приложения панели инструментов MATLAB в разделе Создание кода щелкните значок приложения Кодер графического процессора. Вы также можете открыть приложение, введя gpucoder в окне команд MATLAB. Приложение открывает страницу Выбор исходных файлов.
На странице Выбор исходных файлов введите или выберите имя основной функции. mandelbrot_count. Основная функция также известна как функция верхнего уровня или начального уровня. Приложение создает проект с именем по умолчанию mandelbrot_count.prj в текущей папке.

Щелкните Далее (Next) и перейдите к шагу Определить типы ввода (Define Input Types). Приложение анализирует функцию на предмет проблем кодирования и готовности к созданию кода. Если приложение выявляет проблемы, открывается страница «Проверка готовности к созданию кода», на которой можно просмотреть и устранить проблемы. В этом примере, поскольку приложение не обнаруживает проблем, открывается страница Определение типов ввода.
Генератор кода должен определять типы данных всех переменных в файлах MATLAB во время компиляции. Поэтому необходимо указать типы данных всех входных переменных. Можно указать типы входных данных одним из следующих двух способов:
Укажите тестовый файл, вызывающий функции начальной точки проекта. Приложение GPU Coder может определить типы входных аргументов, запустив тестовый файл.
Введите типы ввода напрямую.
Дополнительные сведения о спецификациях ввода см. в разделе Спецификация ввода.
В этом примере для определения свойств входных данных maxIterations, xGrid, и yGrid, укажите тестовый файл mandelbrot_test.m:
Введите или выберите тестовый файл mandelbrot_test.m.
Щелкните Автоопределить типы ввода (Autodefine Input Types).
Тестовый файл mandelbrot_test.m вызывает функцию точки входа, mandelbrot_count.m с ожидаемыми типами ввода. Приложение делает вывод, что входные данные maxIterations является double(1x1) и вводы xGrid и yGrid являются double(1000x1000).

Нажмите кнопку Далее, чтобы перейти к шагу Проверка ошибок времени выполнения.
Шаг Проверка ошибок времени выполнения создает файл MEX из функций начального уровня, запускает функцию MEX и сообщает о проблемах. Этот шаг необязателен. Однако рекомендуется выполнять этот шаг. С помощью этого шага можно обнаружить и исправить дефекты, которые сложнее диагностировать в сгенерированном коде графического процессора.
Кодер GPU предоставляет возможность выполнения специфичных для GPU проверок на данном этапе. При выборе этой опции кодер графического процессора генерирует код CUDA и файл MEX из функций начального уровня, выполняет функцию MEX и сообщает о проблемах. Некоторые из специфичных для GPU проверок времени выполнения включают в себя:
Проверка на наличие разливов регистров.
Проверка соответствия размера стека.
Примечание
В коде могут существовать определенные конструкции MATLAB, которые приводят к тому, что проверка ошибок времени выполнения не проходит проверки, специфичные для CPU, но проходят проверки, специфичные для GPU.
Чтобы открыть диалоговое окно Проверка на наличие проблем во время выполнения, щелкните стрелку Проверка на наличие проблем.
В диалоговом окне Check for Run-Time Issues укажите тестовый файл или введите код, вызывающий функцию начальной точки с примерами входных данных. Для этого примера используйте тестовый файл mandelbrot_test.m который использовался для определения типов ввода.
Для активизации специфичных для GPU проверок нажмите кнопку опции GPU. Щелкните Проверить наличие проблем.
Приложение генерирует функцию MEX. Он запускает тестовый сценарий mandelbrot_test замена вызовов mandelbrot_count с вызовами сгенерированного MEX. Если приложение обнаруживает проблемы во время создания или выполнения функции MEX, оно выдает предупреждения и сообщения об ошибках. Вы можете щелкнуть эти сообщения, чтобы перейти к проблемному коду и устранить проблему. В этом примере приложение не обнаруживает проблем. Функция MEX имеет те же функции, что и исходная mandelbrot_count функция.

Примечание
В коде могут существовать определенные конструкции MATLAB, которые приводят к тому, что проверка ошибок времени выполнения не проходит проверки, специфичные для CPU, но проходят проверки, специфичные для GPU.
Нажмите кнопку Далее, чтобы перейти к шагу Создать код.
Чтобы открыть диалоговое окно «Генерировать», щелкните стрелку «Генерировать».

В диалоговом окне «Создание» можно выбрать тип сборки, которую необходимо выполнить с помощью кодера графического процессора. Доступные параметры перечислены в этой таблице.
| Тип построения | Описание |
|---|---|
Source code | Исходный код CUDA для интеграции с внешним проектом. |
MEX | Скомпилированный код для запуска внутри MATLAB. |
Static Library | Двоичная библиотека для статической связи с внешним проектом. |
Dynamic Library | Двоичная библиотека для динамической связи с внешним проектом. |
Executable | Автономная программа (требуется пользовательский основной файл CUDA). |
Для данного учебного пособия задайте для параметра «Тип сборки» значение MEX(.mex). Путем создания выходного документа MEX можно проверить правильность сгенерированного кода CUDA в MATLAB. Тип сборки MEX не требует дополнительных настроек, таких как Toolchain и Hardware Board. Также не предусмотрена возможность создания только исходного кода. Программа GPU Coder может автоматически выбирать доступную цепочку инструментов CUDA при условии правильной настройки переменных среды.
Для просмотра дополнительных параметров выберите Дополнительные параметры настройки - > Код графического процессора. К параметру «Флаги компилятора» добавить --fmad=false. Этот флаг при передаче nvcc, предписывает компилятору отключить оптимизацию умножения с плавающей запятой (FMAD). Эта опция предназначена для предотвращения числового несоответствия в сгенерированном коде из-за архитектурных различий между CPU и GPU. Дополнительные сведения см. в разделе Числовые различия между ЦП и графическим процессором.

Щелкните Создать (Generate).
Кодер графического процессора генерирует исполняемый файл MEX mandelbrot_count_mex в рабочей папке. <pwd>\codegen\mex\mandelbrot_count содержит все остальные созданные файлы, включая исходный файл CUDA (* .cu) и файлы заголовков. Приложение GPU Coder указывает, что создание кода выполнено успешно. Он отображает исходные файлы MATLAB и созданные выходные файлы в левой части страницы. На вкладке Переменные (Variables) отображается информация об исходных переменных MATLAB. На вкладке Целевой журнал построения отображается журнал построения, включая предупреждения и ошибки компилятора. По умолчанию в окне кода приложение отображает исходный файл CUDAmandelbrot_count.cu. Чтобы просмотреть другой файл, на панели Исходный код (Source Code) или Выходные файлы (Output Files) щелкните имя файла.

Чтобы просмотреть отчет о создании кода, щелкните Показать отчет. Отчет содержит ссылки на код MATLAB и созданные файлы CUDA (* .cu). Он также предоставляет информацию о времени компиляции для переменных и выражений в коде MATLAB. Эта информация помогает найти источники ошибок и предупреждений. Это также помогает отладить проблемы создания кода в коде. Дополнительные сведения см. в разделе Отчеты по созданию кода.

Раздел «Ядра GPU» на вкладке «Сгенерированный код» содержит список ядер, созданных во время создания кода GPU. Элементы в этом списке связаны с соответствующим исходным кодом. Например, при нажатии кнопки mandelbrot_count_kernel1 в окне браузера кода отображается раздел кода для этого ядра.
После просмотра отчета можно закрыть окно Отчет о создании кода. Чтобы просмотреть отчет позже, откройте report.mldatx в <pwd>\codegen\mex\mandelbrot_cout\html папка.
<pwd>\codegen\mex\mandelbrot_count содержит gpu_codegen_info.mat MAT-файл, содержащий статистику для сгенерированного кода графического процессора. Этот MAT-файл содержит cuda_Kernel переменная, которая содержит информацию о размерах потоков и блоков, совместном и постоянном использовании памяти, а также входных и выходных аргументах каждого ядра. cudaMalloc и cudaMemcpy переменные содержат информацию о размере всех переменных GPU и количестве memcpy вызовы между хостом и устройством.

В приложении Кодер графического процессора нажмите кнопку Далее, чтобы открыть страницу Завершение рабочего процесса.
Страница «Завершение рабочего процесса» показывает, что создание кода выполнено успешно. Он предоставляет сводку проекта и ссылки на исходные файлы MATLAB, отчет о создании кода и созданные выходные двоичные файлы. Параметры конфигурации текущего проекта кодера графического процессора можно сохранить в виде сценария MATLAB. См. раздел Преобразование проекта кодера MATLAB в сценарий MATLAB.

Для проверки правильности созданного MEX-файла см. раздел Проверка правильности сгенерированного кода.