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

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

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

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

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

В качестве альтернативы, если вы имеете Embedded Coder® и включаете производство отчета генерации кода с трассируемостью, можно просмотреть исходный код MATLAB и сгенерированный код CUDA друг рядом с другом. Когда вы перемещаете указатель через код, можно следовать за подсвеченными трассировками к соответствующему сгенерированному коду или источнику код MATLAB.

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

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

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

Создайте тестовые векторы

Создайте скрипт MATLAB по имени mandelbrot_test.m со следующими строками кода. Скрипт генерирует 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);

Представьте отчет генерации кода с трассируемостью

Чтобы сгенерировать отчет, который имеет трассируемость:

  • Создайте coder.gpuConfig объект. По умолчанию опция трассируемости включена.

  • Задайте типы входных параметров передающими представительными входными значениями к -args опция.

  • Включите производство отчета генерации кода при помощи -report опция.

cfg = coder.gpuConfig('mex');
cfg.GpuConfig.CompilerFlags = '--fmad=false';
codegen -config cfg -args {maxIterations,xGrid,yGrid} mandelbrot_count -report

Примечание

--fmad=false отметьте, когда передано nvcc, сообщает, что компилятор, чтобы отключить С плавающей точкой Умножается - Добавляет оптимизация (FMAD). Эта опция собирается предотвратить числовое несоответствие в сгенерированном коде из-за архитектурных различий в центральном процессоре и графическом процессоре. Для получения дополнительной информации смотрите Числовые Различия Между центральным процессором и графическим процессором.

Доступ к отчету

Чтобы открыть отчет генерации кода, нажмите View report.

В панели кода выберите mandelbrot_count.m. Вы видите исходный код MATLAB в окне кода.

Зеленый GPU маркер рядом с mandelbrot_count функция указывает, что сгенерированный код имеет и разделы центрального процессора и графического процессора. Зеленая вертикальная панель указывает на строки кода, которые сопоставлены с графическим процессором. Можно переместить мышь через подсвеченные области, чтобы видеть переменную информацию и ядро графического процессора, которое содержит соответствующий код MATLAB. Когда вы выбираете подсвеченный код путем нажатия на него, код становится синим, и вы видите информацию, даже когда вы отодвигаете указатель от выбора. Код остается выбранным, пока вы не нажимаете Esc или выберите различный код.

Ограничения

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

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

  • Код, который сопоставлен с вызовами библиотеки, такими как cuDNN, cuBLAS и cuFFT, не будет подсвечен

В результате функции, которые полностью сопоставлены с графическим процессором, могут быть помечены неправильно.

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

|

Похожие темы