Этот пример показывает три способа ускорить симуляцию коммуникационных алгоритмов в MATLAB®. В частности, это демонстрирует эффекты, которые использующий Системные объекты, MATLAB к генерации кода C и выполнения параллельной обработки (использующий функцию parfor
MATLAB) имеют на скорость симуляции.
Совместное воздействие использования этих методов может ускорить типичное время симуляции порядком величины. Различие эквивалентно выполнению симуляции в течение ночи или в течение всего нескольких часов.
Системные объекты этот пример функции доступны в продукте Communications Toolbox™. В порядке запустить MATLAB к разделу генерации кода C этого примера, у вас должна быть лицензия MATLAB Coder™. В порядке запустить раздел параллельной обработки этого примера, у вас должна быть лицензия Parallel Computing Toolbox™.
Этот пример исследует различные реализации следующей системы приемопередатчика:
Эта система состоит из передатчика, модели канала и получателя. Передатчик обрабатывает входной поток битов со сверточным энкодером, interleaver, модулятором и энкодером блока пространства-времени MIMO [1], [2]. Переданный сигнал затем обрабатывается 2x2 канал MIMO и канал аддитивного белого гауссова шума (AWGN). Получатель обрабатывает свой входной сигнал с 2x2 декодер блока пространства-времени MIMO, демодулятор, deinterleaver и Декодер Витерби, чтобы восстановить наилучшую оценку входного потока битов в получателе.
Рабочий процесс этого примера следующие:
Запустите с функционального алгоритма как своя базовая линия
Используйте графический интерфейс пользователя профилировщика MATLAB, чтобы идентифицировать узкие места скорости
Улучшите время симуляции с помощью Системных объектов
Ускорьте симуляцию с MATLAB к генерации кода C
Достигните еще более быстрой симуляции с помощью выполнений параллельной обработки
Запустите с функции, которая представляет первую версию или базовую реализацию этого алгоритма. Входные параметры к функции commaccelerationbaseline являются значением Eb/No текущего кадра (EbNo) и количества битов процессы алгоритма (MaxNumBits). Eb/No является отношением энергии на бит к шумовой степени спектральная плотность. Функциональный вывод является частотой ошибок по битам (BER) алгоритма. Обратите внимание на то, что базовая реализация алгоритма использует функции и объекты данных от Communications Toolbox, наряду с некоторыми пользовательскими функциями, такими как localmimoencoder, localmimodecoder и localmimochannel.
type commaccelerationbaseline
Как отправная точка, измерьте время, которое требуется, чтобы запустить этот базовый алгоритм в MATLAB. Используйте MATLAB, синхронизирующий функции (тик и toc), чтобы записать прошедшее время для выполнения этой функции, как это называется в цикле for, который выполняет итерации по значениям Eb/No от 0 до 7 дБ.
MaxSNRdB=7;EbNo=1;MaxNumBits=2e5; N=1;str='Baseline'; commaccelerationbaseline(EbNo,1e4); berBaseline=zeros(size(0:MaxSNRdB)); fprintf(1,'Processing the baseline algorithm.\n'); tic; for EbNo=0:MaxSNRdB y=commaccelerationbaseline(EbNo,MaxNumBits); berBaseline(EbNo+1)=y; end a=toc;
Результат показывает время симуляции (в секундах) базового алгоритма. Используйте это измерение в качестве критерия, чтобы соответствовать последующим версиям алгоритма.
commaccelerationreportresults(N,a,a,str);
Идентифицируйте узкие места обработки и проблемные области базового алгоритма с помощью профилировщика MATLAB. Получите информацию о профилировщике путем выполнения следующего скрипта:
profile on y=commaccelerationbaseline(EbNo,1e5); profile off
Отчет профилирования представляет время выполнения для каждого вызова функции алгоритма в порядке убывания. Первые несколько функций, которые изображает окно Profiler, представляют узкое место скорости алгоритма. В этом случае две пользовательских функции (localmimodecoder и localmimochannel) и функция vitdec (Функция декодера Витерби Тулбокса) идентифицированы как главные узкие места скорости.
Функция commaccelerationsystemobjects реализует вторую версию алгоритма, который использует Системные объекты от Communications Toolbox. Среди десяти вызовов функции, найденных в базовой версии этого алгоритма, девять вызовов заменяются соответствующими вызовами доступных Системных объектов. Получившаяся функция commaccelerationsystemobjects состоит из двух отличных частей:
Объявление, которое создает Системные объекты
Выполнение, которое вызывает метод шага для каждой Системы object™ в порядке выполнить определенные операции.
type commaccelerationsystemobjects
Измерьте время симуляции для этой версии алгоритма. Запишите прошедшее время для выполнения этой функции в том же цикле for как прежде.
N=2; str='Using System objects'; commaccelerationsystemobjects(EbNo,1e4); berSystemobject=zeros(size(berBaseline)); fprintf(1,'Processing the System object version of the algorithm.\n'); tic; for EbNo=0:MaxSNRdB y=commaccelerationsystemobjects(EbNo,MaxNumBits); berSystemobject(EbNo+1)=y; end b=toc;
Результат показывает время симуляции версии Системного объекта алгоритма. Обратите внимание на то, что заменяя вызовы функций с вызовами Системных объектов, алгоритм запускается быстрее. Это поведение ожидается, потому что одним из преимуществ использования Системных объектов является эффективность. Алгоритмы с помощью Системных объектов разделяют объявление от выполнения, которое избегает повторных стандартных программ контроля ввода и верификации, найденных в функциональных алгоритмах. Реализация алгоритма, которая использует Системные объекты, выполняет обработку параметра и инициализации только однажды, вне цикла, и использует эффективные реализации MEX Системных объектов, который улучшает полную производительность симуляции.
commaccelerationreportresults(N,a,b,str);
MATLAB Coder генерирует портативный и читаемый код С из алгоритмов, которые являются частью подмножества генерации кода MATLAB. Функция commaccelerationsystemobjects, вторая версия алгоритма, использует Системные объекты, которые поддерживают генерацию кода с MATLAB Coder. Поэтому этот алгоритм может быть скомпилирован и соединен в MATLAB как MEX (исполняемый файл MATLAB) функция. Используйте MATLAB Coder codegen команда, чтобы скомпилировать версию Системных объектов алгоритма в MEX-функцию (названный commaccelerationsystemobjects_mex).
Примечание: у Вас должна быть лицензия MATLAB Coder, чтобы запустить этот раздел примера.
codegen('commaccelerationsystemobjects.m','-args',{EbNo,MaxNumBits})
Измерьте время симуляции для версии MEX алгоритма. Запишите прошедшее время для выполнения этой функции в том же цикле for как прежде.
N=3; str='MATLAB to C code generation'; commaccelerationsystemobjects_mex(EbNo,1e4); berCodegen=zeros(size(berBaseline)); fprintf(1,'Processing the MEX function of the second version of the algorithm.\n'); tic; for EbNo=0:MaxSNRdB y=commaccelerationsystemobjects_mex(EbNo,MaxNumBits); berCodegen(EbNo+1)=y; end c=toc;
Результат показывает время симуляции версии MEX алгоритма. Обратите внимание на то, что путем компиляции алгоритма Системного объекта в MEX-функцию, версия MEX алгоритма запускается быстрее и, чем второе и, чем базовые версии алгоритма. Это поведение ожидается, потому что одним из преимуществ использования MATLAB к генерации кода C является ускорение симуляции. Несмотря на то, что алгоритм, который использует Системные объекты, высоко оптимизирован, генерация кода может ускорить симуляцию путем блокировки вниз размеров и типов данных переменных в функции. Этот процесс делает выполнение более эффективным, потому что это удаляет издержки интерпретированного языка, который проверяет на размер и тип данных в каждой строке кода.
commaccelerationreportresults(N,a,c,str);
Используйте несколько ядер, чтобы увеличить ускорение симуляции выполняющимися задачами параллельно. Используйте выполнения параллельной обработки (циклы parfor
) в MATLAB, чтобы выполнить работу над количеством доступных рабочих. Parallel Computing Toolbox позволяет вам запустить различные итерации симуляции параллельно. Используйте функцию parpool
, чтобы зарезервировать много работников MATLAB для выполнения последующего parfor
- цикл. В этом примере, два рабочих, запущенных локально на клиентской машине MATLAB.
Примечание: у Вас должна быть лицензия Parallel Computing Toolbox, чтобы запустить этот раздел примера.
if isempty(gcp('nocreate')), parpool; end
Измерьте время симуляции для версии MEX алгоритма, который выполняется в parfor
- цикл, а не цикл for, используемый в предыдущих случаях.
N=4; str='Parallel simulation runs with parfor'; commaccelerationsystemobjects_mex(EbNo,1e4); berPct=zeros(size(berBaseline)); fprintf(1,'Processing the MEX function of the second version of the algorithm within a parfor-loop.\n'); tic; parfor EbNo=0:MaxSNRdB y=commaccelerationsystemobjects_mex(EbNo,MaxNumBits); berPct(EbNo+1)=y; end d=toc;
Результат показывает время симуляции версии MEX второго алгоритма, выполняющегося в parfor
- цикл. Обратите внимание на то, что путем выполнения этой версии в parfor
- цикл мы получаем самую быструю производительность симуляции. Фундаментальное понятие parfor
- цикл совпадает со стандартным циклом for MATLAB. Различие - то, что parfor
делит итерации цикла на группы так, чтобы каждый рабочий выполнил некоторый фрагмент общего количества итераций. Поскольку несколько работников MATLAB могут быть вычислительными одновременно на том же цикле, parfor
- цикл обеспечивает значительно лучшую производительность, чем ее аналогичный цикл for.
commaccelerationreportresults(N,a,d,str);
Совместное воздействие
Системные объекты,
MATLAB к генерации кода C и
Выполнения параллельной обработки
может значительно ускорить симуляции ваших коммуникационных алгоритмов.
Системные объекты помогают улучшить скорость симуляции путем выполнения обработки параметра и инициализаций только однажды вне цикла выполнения путем использования эффективных реализаций MEX Системных объектов, и путем предотвращения повторенных стандартных программ контроля ввода и верификации, найденных в функциональных алгоритмах.
MATLAB к генерации кода C ускоряет симуляцию путем блокировки вниз типов данных и размеров каждой переменной и путем сокращения издержек интерпретированного языка, который проверяет на размер и тип данных переменных в каждой строке кода.
Выполнения параллельной обработки могут существенно ускорить симуляцию путем вычисления различных итераций алгоритма одновременно на множестве доступных работников MATLAB.
В этом примере мы используем функциональный parpool
, чтобы зарезервировать много работников MATLAB, которые запускаются локально на нашей клиентской машине MATLAB. Путем изменения параллельных настроек можно ускорить симуляцию еще больше путем выполнения алгоритма на большем кластере рабочих, которые не находятся на клиентской машине MATLAB. Для описания того, как управлять и использовать параллельные настройки, смотрите Программирование со страницей User Configurations Руководства пользователя Parallel Computing Toolbox.
В этом примере версии базового и Системного объекта алгоритма не численно идентичны. Пользовательская функция localmimodecoder используемый в базовом алгоритме реализует немного отличающуюся версию операции блокового декодирования пространства-времени MIMO, чем та, используемая в коммуникации. Системный объект OSTBCCombiner второй версии алгоритма. Тем не менее, когда вы запускаете каждую из первых трех версий алгоритма (базовая версия, версия Системного объекта и MEX-функция второй версии) с достаточно большим количеством входных битов, вы получите очень похожие кривые BER, указывающие на подобную числовую производительность для различных версий алгоритма. Здесь вы находите кривые BER полученными путем выполнения каждой из трех версий алгоритма с количеством входного набора битов к десяти миллионам (т.е. MaxNumBits=1e7).
Следующие функции используются в этом примере.
С. М. Аламоути, "Простой метод разнообразия передачи для радиосвязей", Журнал IEEE® на Выбранных областях в Коммуникациях, издании 16, № 8, стр 1451-1458, октябрь 1998.
V. Tarokh, Х. Джэфархэми и А. Р. Колдербэнк, "Пространственно-временные блочные коды из ортогональных проектов", Транзакции IEEE на Теории информации, издании 45, № 5, стр 1456-1467, июль 1999.