В этом примере показано, как сгенерировать файл 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