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

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

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

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

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

Можно проследить при помощи одного из этих методов:

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

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

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

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

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

Множество Мандельброта является областью в комплексной плоскости, состоящей из значений 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 1 000 сеток действительных частей (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

    Примечание

    --fmad=false отметьте, когда передано nvcc, сообщает, что компилятор, чтобы отключить С плавающей точкой Умножается - Добавляет оптимизация (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®

    • Псевдокод

  • Внешний вид или местоположение комментариев могут варьироваться:

    • Даже если код реализации устраняется, например, из-за сворачивания констант, комментарии могут все еще появиться в сгенерированном коде.

    • Если полный блок функции или кода устраняется, комментарии могут быть устранены из сгенерированного кода.

    • Для определенной оптимизации комментарии могут быть разделены от сгенерированного кода.

    • Даже если вы не принимаете решение включать комментарии исходного кода в сгенерированный код, сгенерированный код включает по закону требуемые комментарии из исходного кода MATLAB.

  • Функции с несколькими выходными параметрами не становятся подсвеченными.

  • Вызовы coder функционирует, такие как coder.nullcopy не будет подсвечен

  • Код, который сопоставлен с вызовами библиотеки, такими как cuDNN, cuBLAS и cuFFT, не будет подсвечен. В результате функции, которые полностью сопоставлены с графическим процессором, могут быть помечены неправильно.

Смотрите также

| | |

Похожие темы