exponenta event banner

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

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

  • Узнайте, как генератор кода сопоставляет ваш алгоритм с ядрами GPU.

  • Проблемы отладки в созданном коде.

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

Трассировку можно выполнить одним из следующих способов:

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

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

Создание тегов отслеживания

Создание исходного кода MATLAB

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

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

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

См. также

| | |

Связанные темы