В этом примере показано, как проследить (выделить разделы) между MATLAB® исходный код и сгенерированный CUDA® код. Трассировка между исходным кодом и сгенерированным кодом помогает вам:
Поймите, как генератор кода сопоставляет ваш алгоритм с ядрами графический процессор.
Отладка проблем в сгенерированном коде.
Оцените качество сгенерированного кода.
Проследить можно с помощью одного из следующих методов:
Сконфигурируйте GPU Coder™, чтобы сгенерировать код, который включает исходный код MATLAB в качестве комментариев. В комментариях тег трассируемости непосредственно предшествует каждой строке исходного кода. Тег трассируемости содержит подробную информацию о местоположении исходного кода. Если у вас есть Embedded Coder®В отчете о генерации кода теги трассируемости ссылаются на соответствующий исходный код MATLAB.
С помощью Embedded Coder создайте отчет генерации кода, который включает интерактивную трассируемость. Интерактивная трассировка в отчете помогает вам визуализировать сопоставление между исходным кодом MATLAB и сгенерированным кодом C/C + +. Смотрите Интерактивное Отслеживание между Кодом MATLAB и Сгенерированным Кодом C/C + + (Embedded Coder).
Чтобы проиллюстрировать теги трассируемости, этот пример использует реализацию набора Mandelbrot с помощью стандартных команд MATLAB, выполняемых на центральном процессоре. Эта реализация основана на коде, представленном в электронной книге «Эксперименты с MATLAB» Клева Молера.
Набор Мандельброта является областью в комплексной плоскости, состоящей из значений z 0, для которых траектории, заданные этим уравнением, остаются ограниченными при k→∞.
Создайте функцию MATLAB mandelbrot_count.m
со следующими строками кода. Этот код является векторизованной реализацией MATLAB набора Мандельброта. Для каждой точечной (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 source code as comments равным 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
Примечание
The --fmad=false
флаг при передаче в nvcc
, инструктирует компилятор отключить оптимизацию с плавающей точкой Multiply-Add (FMAD). Эта опция предназначена для предотвращения численного несоответствия в сгенерированном коде из-за архитектурных различий в центральном процессоре и графическом процессоре. Для получения дополнительной информации см. раздел «Численные различия между центральным процессором и графическим процессором».
Чтобы открыть отчет генерации кода, нажмите View report.
Имя отчета генерации кода report.mldatx
. Он расположен в html
подпапка выходной папки генерации кода. Если у вас есть MATLAB R2018a или позже, можно открыть report.mldatx
дважды кликнув по файлу.
На панели MATLAB Source выберите mandelbrot_count.m
. Исходный код MATLAB отображается на панели кода.
Зеленый маркер GPU рядом с mandelbrot_count
функция указывает, что сгенерированный код имеет разделы как центральный процессор, так и графический процессор. Зеленая вертикальная полоса указывает строки кода, которые сопоставлены с графическим процессором. Чтобы увидеть информацию о типе переменной или выражения и имени соответствующего GPU Kernel Function, остановитесь на переменной или выражении. Когда вы выбираете подсвеченный код, нажимая на него, код становится синим, и вы можете увидеть информацию, даже когда вы уводите указатель от выбора. Код остается выбранным, пока вы не нажмете Esc
или выберите другой код.
Просмотр кода CUDA, сгенерированного для mandelbrot_count.m
функцию точки входа, выберите mandelbrot_count.cu
на панели Generated Code.
В сгенерированном коде теги трассируемости появляются непосредственно перед исходным кодом 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