Код CUDA от CWT

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

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

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

cfg = coder.gpuConfig('mex');

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

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]) задает вектор-строку из длины 100,000 содержащий действительный 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 генерирует отчет генерации кода. Во вкладке Summary отчета можно найти метрическую ссылку графического процессора кода, которая предоставляет подробную информацию, такую как количество сгенерированных ядер CUDA и сколько памяти было выделено.

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

[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 и MEX графического процессора scalograms идентичны.

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

  single

  6.7237e-07