Этот пример показывает три способа ускорить симуляцию коммуникационных алгоритмов в 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, синхронизирующий функции (tic и 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, чем та, используемая в comm.OSTBCCombiner Системном объекте второй версии алгоритма. Тем не менее, когда вы запускаете каждую из первых трех версий алгоритма (базовая версия, версия Системного объекта и MEX-функция второй версии) с достаточно большим количеством входных битов, вы получите очень похожие кривые BER, указывающие на подобную числовую эффективность для различных версий алгоритма. Здесь вы находите кривые BER полученными путем выполнения каждой из трех версий алгоритма с количеством входного набора битов к десяти миллионам (i.e. MaxNumBits=1e7).
Следующие функции используются в этом примере.
С. М. Аламоути, "Простой метод разнообразия передачи для радиосвязей", Журнал IEEE® на Выбранных областях в Коммуникациях, издании 16, № 8, стр 1451-1458, октябрь 1998.
V. Tarokh, Х. Джэфархэми и А. Р. Колдербэнк, "Пространственно-временные блочные коды из ортогональных проектов", Транзакции IEEE на Теории информации, издании 45, № 5, стр 1456-1467, июль 1999.