В этом примере показана трассировка (выделение разделов) между исходным кодом MATLAB ® и сгенерированным кодом CUDA ®. Трассировка между исходным кодом и сгенерированным кодом помогает:
Узнайте, как генератор кода сопоставляет ваш алгоритм с ядрами GPU.
Проблемы отладки в созданном коде.
Оцените качество созданного кода.
Трассировку можно выполнить одним из следующих способов:
Настройте Coder™ графического процессора для создания кода, включающего исходный код MATLAB в качестве комментариев. В комментариях тег отслеживания непосредственно предшествует каждой строке исходного кода. Тег отслеживания содержит сведения о расположении исходного кода. При использовании Embedded Coder ® в отчете о создании кода теги отслеживания связываются с соответствующим исходным кодом MATLAB.
С помощью Embedded Coder создайте отчет о создании кода, включающий интерактивное отслеживание. Интерактивная трассировка в отчете позволяет визуализировать сопоставление между исходным кодом MATLAB и сгенерированным кодом C/C + +. См. раздел Интерактивная трассировка между кодом MATLAB и сгенерированным кодом C/C + + (встроенный кодер).
Для иллюстрации тегов отслеживания в этом примере используется реализация набора Mandelbrot с использованием стандартных команд MATLAB, выполняемых на CPU. Эта реализация основана на коде, предоставленном в электронной книге «Эксперименты с MATLAB» Клеве Молер.
Множество Мандельброта - это область в комплексной плоскости, состоящая из значений z0, для которых траектории, определенные этим уравнением, остаются ограниченными в k→∞.
0, 1,...
Создание функции MATLAB с именем mandelbrot_count.m со следующими строками кода. Этот код является векторизированной реализацией MATLAB набора Mandelbrot. Для каждой точки (xGrid,yGrid) в сетке вычисляется индекс итерации count при которой траектория, определенная уравнением, достигает расстояния 2 от происхождения. Затем возвращается натуральный логарифм count, который используется для генерации цветокодированного графика набора Мандельброта.
function count = mandelbrot_count(maxIterations,xGrid,yGrid) % 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);
Создайте тестовые векторы для функции точки входа, используя следующие строки кода. Сценарий создает сетку 1000 x 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);
Чтобы создать теги отслеживания в созданном коде, включите создание исходного кода MATLAB в виде комментариев.
В приложении GPU Coder установите исходный код MATLAB в качестве комментариев Yes.
В объекте конфигурации создания кода создайте coder.gpuConfig и установите MATLABSourceComments свойство для true.
cfg = coder.gpuConfig('dll','ecoder',true); cfg.GenerateReport = true; cfg.MATLABSourceComments = true; cfg.GpuConfig.CompilerFlags = '--fmad=false'; codegen -config cfg -args {maxIterations,xGrid,yGrid} mandelbrot_count
Примечание
--fmad=false флаг при передаче в nvcc, предписывает компилятору отключить оптимизацию умножения с плавающей запятой (FMAD). Эта опция предназначена для предотвращения численного несоответствия в сгенерированном коде из-за архитектурных различий в CPU и GPU. Дополнительные сведения см. в разделе Числовые различия между ЦП и графическим процессором.
Чтобы открыть отчет о создании кода, щелкните Просмотр отчета.
Отчет о создании кода имеет имя report.mldatx. Он расположен в html подпапка выходной папки генерации кода. При наличии MATLAB R2018a или более поздней версии можно открыть report.mldatx двойным щелчком на файле.
На панели «Источник MATLAB» выберите mandelbrot_count.m. Исходный код MATLAB отображается на панели кода.

Зеленый маркер графического процессора рядом с mandelbrot_count функция указывает, что сгенерированный код имеет секции CPU и GPU. Зеленая вертикальная полоса обозначает строки кода, отображаемые на графический процессор. Чтобы просмотреть информацию о типе переменной или выражения и имени соответствующей функции ядра графического процессора, наведите паузу на переменную или выражение. При выборе выделенного кода щелчком по нему код становится синим, и информация отображается даже при удалении указателя от выделенного фрагмента. Код остается выбранным до нажатия Esc или выберите другой код.
Просмотр кода CUDA, созданного для mandelbrot_count.m функция точки входа, выберите mandelbrot_count.cu на панели Сгенерированный код.
В созданном коде теги отслеживания появляются непосредственно перед исходным кодом MATLAB в комментарии. Формат тега:
<filename>:<line number>.
Например, этот комментарий указывает, что код z0 = xGrid + 1i*yGrid; появляется в строке 5 в исходном файле mandelbrot_count.m.
/* 'mandelbrot_count:5' z0 = xGrid + 1i*yGrid;
Нельзя включать исходный код MATLAB в качестве комментариев для:
Функции панели инструментов MathWorks ®
P-код
Внешний вид или расположение комментариев может варьироваться:
Даже если код реализации исключается, например, из-за постоянного сворачивания, комментарии все равно могут появляться в сгенерированном коде.
Если полная функция или блок кода устранены, комментарии могут быть исключены из сгенерированного кода.
Для некоторых оптимизаций комментарии можно отделить от созданного кода.
Даже если вы не решили включить комментарии к исходному коду в созданный код, созданный код включает юридически обязательные комментарии из исходного кода MATLAB.
Функции с несколькими выходами не выделяются.
Звонки в coder функции, такие как coder.nullcopy не будет выделено
Код, отображаемый на вызовы библиотеки, такие как cuDNN, cuBLAS и cuFFT, не будет выделен. В результате функции, полностью отображенные на графический процессор, могут быть помечены неправильно.
codegen | coder.CodeConfig | coder.EmbeddedCodeConfig | coder.gpuConfig