Трассировка между сгенерированным кодом CUDA и исходным кодом MATLAB

В этом примере показано, как проследить (выделить разделы) между MATLAB® исходный код и сгенерированный CUDA® код. Трассировка между исходным кодом и сгенерированным кодом помогает вам:

  • Поймите, как генератор кода сопоставляет ваш алгоритм с ядрами графический процессор.

  • Отладка проблем в сгенерированном коде.

  • Оцените качество сгенерированного кода.

Проследить можно с помощью одного из следующих методов:

  • Сконфигурируйте GPU Coder™, чтобы сгенерировать код, который включает исходный код MATLAB в качестве комментариев. В комментариях тег трассируемости непосредственно предшествует каждой строке исходного кода. Тег трассируемости содержит подробную информацию о местоположении исходного кода. Если у вас есть Embedded Coder®В отчете о генерации кода теги трассируемости ссылаются на соответствующий исходный код MATLAB.

  • С помощью Embedded Coder создайте отчет генерации кода, который включает интерактивную трассируемость. Интерактивная трассировка в отчете помогает вам визуализировать сопоставление между исходным кодом MATLAB и сгенерированным кодом C/C + +. Смотрите Интерактивное Отслеживание между Кодом MATLAB и Сгенерированным Кодом C/C + + (Embedded Coder).

Сгенерируйте теги трассируемости

Создайте исходный код MATLAB

Чтобы проиллюстрировать теги трассируемости, этот пример использует реализацию набора Mandelbrot с помощью стандартных команд MATLAB, выполняемых на центральном процессоре. Эта реализация основана на коде, представленном в электронной книге «Эксперименты с MATLAB» Клева Молера.

Набор Мандельброта является областью в комплексной плоскости, состоящей из значений z 0, для которых траектории, заданные этим уравнением, остаются ограниченными при k→∞.

zk+1=zk2+z0,k=0,1,

Создайте функцию 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, не будет подсвечиваться. В результате функции, которые полностью сопоставлены с графическим процессором, могут быть помечены неправильно.

См. также

| | |

Похожие темы