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