exponenta event banner

Код CUDA от CWT

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

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

Создайте объект конфигурации кодера графического процессора.

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));

Приведите сигнал, чтобы использовать единственную точность. Вычисления GPU часто выполняются более эффективно с одной точностью. Однако можно создать код для двойной точности, если графический процессор 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 является необязательным. Используя -report создает отчет о создании кода. На вкладке Сводка отчета можно найти ссылку на метрику кода графического процессора, которая содержит подробную информацию, например, количество созданных ядер 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

См. также

|