В этом примере показаны три способа ускорения моделирования коммуникационных алгоритмов в MATLAB ®. В частности, в нем показаны эффекты, связанные с использованием системных объектов, генерацией кода MATLAB-C и параллельными прогонами обработки (с использованием MATLAB).parfor функция) имеют по скорости моделирования.
Комбинированный эффект от использования этих методов может ускорить типичное время моделирования на порядок величины. Разница равна выполнению моделирования в течение ночи или всего нескольких часов.
Системные объекты этого примера доступны в продукте Communications Toolbox™. Для запуска раздела создания кода MATLAB-C в этом примере необходимо иметь лицензию MATLAB Coder™. Чтобы запустить раздел параллельной обработки этого примера, необходимо иметь лицензию Parallel Computing Toolbox™.
В этом примере рассматриваются различные реализации следующей приемопередающей системы:

Эта система состоит из передатчика, модели канала и приемника. Передатчик обрабатывает входной битовый поток сверточным кодером, перемежителем, модулятором и кодером пространственно-временного блока MIMO [1], [2]. Затем передаваемый сигнал обрабатывается каналом 2x2 MIMO и каналом аддитивного белого гауссового шума (AWGN). Приемник обрабатывает свой входной сигнал с помощью декодера пространственно-временного блока 2x2 MIMO, демодулятора, обращенного перемежителя и декодера Витерби для восстановления наилучшей оценки входного битового потока в приемнике.
Поток операций в этом примере выглядит следующим образом:
Начните с алгоритма на основе функций в качестве базовой линии
Использование графического интерфейса профилировщика 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 представляет время выполнения для каждого вызова функции алгоритма в порядке убывания. Первые несколько функций, отображаемых в окне Profiler, представляют узкое место алгоритма. В этом случае две определяемые пользователем функции (localmimodecoder и localmimochannel) и функция vitdec (функция декодера Витерби панели инструментов) идентифицируются как основные узкие места скорости.
Функция commacelerationsystemobjects реализует вторую версию алгоритма, которая использует системные объекты из Communications Toolbox. Среди десяти вызовов функций, найденных в базовой версии этого алгоритма, девять вызовов заменяются соответствующими вызовами доступных системных объектов. Результирующая функция commacelerationsystemobjects состоит из двух отдельных частей:
Объявление, создающее системные объекты
Выполнение, которое вызывает пошаговый метод для каждого системного object™ для выполнения определенных операций.
type commaccelerationsystemobjects
Измерьте время моделирования для этой версии алгоритма. Запишите прошедшее время для выполнения этой функции в том же цикле for-loop, что и ранее.
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;
Результат показывает время моделирования версии системного объекта алгоритма. Обратите внимание, что заменяя вызовы функций вызовами системных объектов, алгоритм работает быстрее. Такое поведение ожидается, поскольку одним из преимуществ использования системных объектов является эффективность. Алгоритмы, использующие объекты System, отделяют объявление от выполнения, что позволяет избежать повторяющихся процедур проверки ввода и проверки, найденных в алгоритмах, основанных на функциях. Реализация алгоритма, использующего системные объекты, выполняет обработку и инициализацию параметров только один раз, вне цикла, и использует эффективные реализации MEX системных объектов, что улучшает общую производительность моделирования.
commaccelerationreportresults(N,a,b,str);
Кодер MATLAB генерирует портативный и читаемый код C из алгоритмов, которые являются частью поднабора генерации кода MATLAB. Функция commacelerationsystemobjects, вторая версия алгоритма, использует системные объекты, поддерживающие генерацию кода с помощью кодера MATLAB. Поэтому этот алгоритм может быть скомпилирован и связан с MATLAB как исполняемая функция MEX (MATLAB). Команда MATLAB Coder codegen используется для компиляции версии алгоритма System objects в функцию MEX (называемую commaccelerationsystemobjects_mex).
Примечание.Для запуска этого раздела примера необходимо иметь лицензию MATLAB Coder.
codegen('commaccelerationsystemobjects.m','-args',{EbNo,MaxNumBits})
Измерьте время моделирования для MEX-версии алгоритма. Запишите прошедшее время для выполнения этой функции в том же цикле for-loop, что и ранее.
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-версии алгоритма. Обратите внимание, что при компиляции алгоритма объекта System в функцию MEX версия алгоритма MEX работает быстрее, чем вторая и базовая версии алгоритма. Такое поведение ожидается, поскольку одним из преимуществ использования генерации кода MATLAB-C является ускорение моделирования. Несмотря на высокую степень оптимизации алгоритма, использующего системные объекты, генерация кода может ускорить моделирование, блокируя размеры и типы данных переменных внутри функции. Этот процесс делает выполнение более эффективным, поскольку он удаляет издержки интерпретируемого языка, который проверяет размер и тип данных в каждой строке кода.
commaccelerationreportresults(N,a,c,str);
Используйте несколько ядер для увеличения ускорения моделирования за счет параллельного выполнения задач. Использовать параллельные прогоны обработки (parfor петли) в MATLAB для выполнения работы по количеству доступных работников. Панель инструментов параллельных вычислений позволяет параллельно выполнять различные итерации моделирования. Используйте parpool функция резервирования количества работников MATLAB для выполнения последующего parfor-луп. В этом примере два работника работают локально на клиентской машине MATLAB.
Примечание.Для запуска этого раздела примера необходимо иметь лицензию Parallel Computing Toolbox.
if isempty(gcp('nocreate')), parpool; end
Измерение времени моделирования для MEX-версии алгоритма, выполняемого в пределах parfor-loop, а не for-loop, использовавшийся в предыдущих случаях.
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-loop совпадает со стандартным MATLAB for-loop. Разница в том, что parfor разделяет итерации цикла на группы, так что каждый работник выполняет некоторую часть общего числа итераций. Поскольку несколько работников MATLAB могут одновременно выполнять вычисления в одном цикле, parfor-loop обеспечивает значительно более высокую производительность, чем его аналогичный for-loop.
commaccelerationreportresults(N,a,d,str);
Совокупные последствия
Системные объекты,
Генерация кода MATLAB-C и
Параллельная обработка прогонов
может значительно ускорить моделирование алгоритмов связи.
Системные объекты помогают повысить скорость моделирования, выполняя обработку и инициализацию параметров только один раз вне цикла выполнения, используя эффективные реализации MEX системных объектов и избегая повторяющихся процедур проверки ввода и проверки, найденных в алгоритмах на основе функций.
Генерация кода MATLAB-C ускоряет моделирование, блокируя типы данных и размеры каждой переменной и уменьшая накладные расходы на интерпретируемый язык, который проверяет размер и тип данных переменных в каждой строке кода.
Параллельная обработка может существенно ускорить моделирование за счет одновременного вычисления различных итераций алгоритма на множестве доступных работников MATLAB.
В этом примере используется функция parpool зарезервировать несколько сотрудников MATLAB, которые работают локально на клиентской машине MATLAB. Изменяя параллельные конфигурации, можно еще больше ускорить моделирование, запустив алгоритм на большем кластере работников, которые не находятся на клиентской машине MATLAB. Описание управления параллельными конфигурациями и их использования см. на странице «Программирование с пользовательскими конфигурациями» Руководства пользователя Parallel Computing Toolbox.
В этом примере версии базовой линии и системного объекта алгоритма не идентичны численно. Определяемый пользователем функциональный локальмимодекодер, используемый в базовом алгоритме, реализует несколько иную версию операции декодирования пространственно-временного блока MIMO, чем та, которая используется в объекте системы OSTBCCombiner второй версии алгоритма. Тем не менее, при запуске каждой из первых трёх версий алгоритма (базовой версии, версии объекта System и функции MEX второй версии) с достаточно большим количеством входных битов вы получите очень похожие кривые BER, указывающие на сходную числовую производительность для разных версий алгоритма. Здесь можно найти кривые BER, полученные при выполнении каждой из трех версий алгоритма с числом входных битов, равным десяти миллионам (т.е. MaxNumBits = 1e7).

В этом примере используются следующие функции.
С. М. Аламути, «Простой метод разнесения передачи для беспроводной связи», IEEE ® Journal on Selected Areas in Communications, том 16, № 8, стр. 1451-1458, октябрь 1998.
В. Тарох, Х. Джафархами и А. Р. Калдербанк, «Пространственно-временные блочные коды из ортогональных конструкций», IEEE Transactions on Information Theory, vol. 45, no. 5, pp. 1456-1467, Jul. 1999.