Код CUDA от CWT

В этом примере показано, как сгенерировать файл MEX для выполнения непрерывного вейвлет (CWT) с использованием сгенерированного кода CUDA.

Во-первых, убедитесь, что у вас есть графический процессор с поддержкой CUDA и компилятор NVCC. Смотрите Приложение GPU Environment Check и Setup (GPU Coder), чтобы убедиться, что у вас есть правильные строения.

Создайте объект строения кодера GPU.

cfg = coder.gpuConfig('mex');

Сгенерируйте сигнал 100 000 выборки на 1000 Гц. Сигнал состоит из двух косинусоидных волн с несвязанными временными поддержками.

t = 0:.001:(1e5*0.001)-0.001;
x = cos(2*pi*32*t).*(t > 10 & t<=50)+cos(2*pi*64*t).*(t >= 60 & t < 90)+ ...
    0.2*randn(size(t));

Приведите сигнал, чтобы использовать одинарную точность. Вычисления графического процессора часто выполняются более эффективно с одной точностью. Однако вы также можете сгенерировать код для двойной точности, если ваш графический процессор NVIDIA поддерживает его.

x = single(x);

Сгенерируйте файл MEX графического процессора и отчет о генерации кода. Чтобы разрешить генерацию файла MEX, необходимо задать свойства (класс, размер и сложность) трех входных параметров:

  • coder.typeof(single(0),[1 1e5]) задает вектор-строку длины 100000, содержащую вещественные single значения.

  • coder.typeof('c',[1 inf]) задает символьный массив произвольной длины.

  • coder.typeof(0) задает реальное double значение.

codegen cwt -config cfg -args {coder.typeof(single(0),[1 1e5]),coder.typeof('c',[1 inf]),coder.typeof(0)} -report
Code generation successful: To view the report, open('codegen/mex/cwt/html/report.mldatx').

Флаг -report опциональен. Использование -report генерирует отчет генерации кода. На вкладке Summary отчета можно найти ссылку на метрики кода GPU, которая предоставляет подробную информацию, такую как количество сгенерированных ядер CUDA и объем выделенной памяти.

Запустите файл MEX на данных и постройте график скалограммы. Подтвердите, что график соответствует двум непересекающимся косинусоидным волнам.

[cfs,f] = cwt_mex(x,'Morse',1e3);
image('XData',t,'YData',f,'CData',abs(cfs),'CDataMapping','scaled')
set(gca,'YScale','log')
axis tight
xlabel('Seconds')
ylabel('Hz')
title('CWT of Two-Tone Signal')

Выполните команду CWT выше, не добавляя _mex. Подтвердите, что скалограммы MATLAB и GPU MEX идентичны.

[cfs2,f2] = cwt(x,'Morse',1e3);
max(abs(cfs2(:)-cfs(:)))
ans =

  single

  6.7583e-07

См. также

|