Этот пример демонстрирует обнаружение ребра в изображении с MEX-функцией CUDA®, сгенерированной от функции MATLAB®. Алгоритм обнаружения ребра реализован с типом данных полуточности.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA включил NVIDIA®, графический процессор с минимумом вычисляет возможность 6,0 и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
В алгоритме обнаружения ребра Sobel sobelEdgeDetectionAlg.m
, 2D пространственная операция градиента выполняется на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, которые соответствуют ребрам в изображении.
type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh) %#codegen %sobelEdgeDetection Example MATLAB function for edge detection. % Copyright 2018 The MathWorks, Inc. kern = half([1 2 1; 0 0 0; -1 -2 -1]); % Finding horizontal and vertical gradients. h = conv2(img(:,:,2),kern,'same'); v = conv2(img(:,:,2),kern','same'); % Finding magnitude of the gradients. e = sqrt(h.*h + v.*v); % Threshold the edges edgeImg = uint8((e > thresh) * 240); end
Алгоритм ребра Sobel вычисляет горизонтальный градиент resX
и вертикальный градиент resY
из входа отображают при помощи двух ортогональных ядер фильтра maskX
и maskY
. После операции фильтрации алгоритм вычисляет величину градиента и применяет порог, чтобы найти области изображений, которые считаются ребрами.
Используйте стандартный imread
команда, чтобы считать изображения. imread
представляет каналы RGB изображения с целыми числами, один для каждого пикселя. Целые числа лежат в диапазоне от 0 до 255. Просто кастинг входных параметров к половине типа может привести к переполнению во время сверток. В этом случае мы можем масштабировать изображения к значениям между 0 и 1.
im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;
Сгенерировать MEX CUDA для sobelEdgeDetectionAlg
функционируйте, создайте объект настройки графического процессора кода и запустите codegen
команда. Чтобы сгенерировать и выполнить код с типами данных полуточности, CUDA вычисляют возможность 6,0, или выше требуется. Установите ComputeCapability
свойство настройки кода возражает против '6.0'
. Для полуточности выделение памяти (malloc) режим для генерации кода CUDA должно быть установлено в 'Дискретный'.
cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '6.0'; cfg.GpuConfig.MallocMode = 'Discrete'; codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;
Code generation successful.
После того, как вы генерируете MEX-функцию, можно проверить, что она имеет ту же функциональность как исходная функция точки входа MATLAB. Запустите сгенерированный sobelEdgeDetectionAlg_mex
и постройте результаты.
out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh); imagesc(out_disp);
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;
codegen
| coder.gpu.kernel
| coder.gpu.kernelfun
| gpucoder.matrixMatrixKernel
| coder.gpu.constantMemory
| gpucoder.stencilKernel
| coder.checkGpuInstall