Ускорение симуляции с использованием системных объектов, MATLAB Coder и Parallel Computing Toolbox

Этот пример показывает три способа ускорить симуляцию алгоритмов связи в MATLAB ®. В частности, в нем показаны эффекты использования системных объектов, генерации кода MATLAB на C и параллельной обработки запусков (с использованием MATLAB parfor функция) имеют на скорости симуляции.

Комбинированный эффект от использования этих методов может ускорить типичное время симуляции на порядок величины. Различие равносильно запуску симуляции за ночь или всего в течение нескольких часов.

Системные объекты этого примера доступны в продукте Communications Toolbox™. В порядок запуска раздела генерации кода MATLAB на C этого примера необходимо иметь MATLAB Coder™ лицензию. Для порядка запуска секции параллельной обработки этого примера необходимо иметь лицензию Parallel Computing Toolbox™.

Введение

В этом примере рассматриваются различные реализации следующей системы приемопередатчика:

Эта система состоит из передатчика, модели канала и приемника. Передатчик обрабатывает входной поток битов сверточным энкодером, перемежителем, модулятором и MIMO пространственно-временным блочным энкодером [1], [2]. Затем переданный сигнал обрабатывается каналом 2x2 MIMO и аддитивным каналом белого гауссова шума (AWGN). Приемник обрабатывает свой входной сигнал с помощью пространственно-временного блочного декодера 2x2 MIMO, демодулятора, обратного перемежителя и декодера Viterbi, чтобы восстановить лучшую оценку входного потока битов в приемнике.

Структура примера

Процесс рабочего процесса этого примера следующий:

  1. Начните с основанного на функции алгоритма в качестве базового уровня

  2. Используйте графический интерфейс пользователя профилировщика MATLAB, чтобы идентифицировать узкие места скорости

  3. Улучшите время симуляции с помощью Системных объектов

  4. Ускорите симуляцию с MATLAB, чтобы Генерация кода C

  5. Достигайте еще более быстрой симуляции с помощью параллельных запусков

Начните с функционального алгоритма как своей базовой линии

Начните с функции, которая представляет первую версию или базовую реализацию этого алгоритма. Входами к функции commaccelerationbaseline являются значение Eb/No текущей системы координат (EbNo) и количество бит процессов алгоритма (MaxNumBits). Eb/No - отношение энергии на бит к спектральной плотности степени шума. Функция выхода является частотой битовой ошибки (BER) алгоритма. Обратите внимание, что реализация алгоритма базового уровня использует функции и объекты данных из Communications Toolbox, наряду с некоторыми пользовательскими функциями, такими как localmimoencoder, localmimodecoder и localmimochannel.

type commaccelerationbaseline

Как начальная точка, измерьте время, необходимое для запуска этого базового алгоритма в MATLAB. Используйте функции синхронизации MATLAB (tic и toc), чтобы записать истекшее время для выполнения этой функции, так как она вызывается в цикле for-loop, который итерация по значениям 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 графического интерфейса пользователя, чтобы идентифицировать узкие места скорости

Идентифицируйте узкие места обработки и проблемные области алгоритма базовой линии, используя Профилировщика MATLAB. Получите информацию о профилировщике путем выполнения следующего скрипта:

profile on
y=commaccelerationbaseline(EbNo,1e5);
profile off

Этот Отчет профилирования представляет время выполнения для каждого вызова функции алгоритма в порядке убывания. Первые несколько функций, которые изображает Профилировщик окно, представляют узкое место скорости алгоритма. В этом случае две пользовательские функции (localmimodecoder и localmimochannel) и функция vitdec (функция декодера Viterbi Toolbox) идентифицируются как основные узкие места скорости.

Улучшите время симуляции, используя системные объекты

Функция commaccelerationsystemobjects реализует вторую версию алгоритма, которая использует Системные объекты из Communications Toolbox. Из десяти вызовов функций, обнаруженных в базовой версии этого алгоритма, девять вызовов заменяются соответствующими вызовами доступных системных объектов. Получившаяся функция commaccelerationsystemobects состоит из двух различных частей:

  • Декларация, которая создает системные объекты

  • Выполнение, которое вызывает метод шага для каждого системного 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;

Результат показывает время симуляции версии алгоритма системный объект. Обратите внимание, что путем замены вызовов функций вызовами Системных объектов, алгоритм запускается быстрее. Это поведение ожидается, потому что одним из преимуществ использования системных объектов является эффективность. Алгоритмы, использующие Системные объекты, отделяют объявление от выполнения, что избегает повторных стандартных программ валидации и верификации входов, найденных в функциональных алгоритмах. Реализация алгоритма, которая использует Системные объекты, выполняет обработку параметров и инициализацию только один раз, за пределами цикла и использует эффективные реализации MEX объектов System, что улучшает общую эффективность симуляции.

commaccelerationreportresults(N,a,b,str);

Ускорите симуляцию с MATLAB, чтобы Генерация кода C

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-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 алгоритма. Обратите внимание, что путем компиляции алгоритма Системного объекта в 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-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-цикл обеспечивает значительно лучшую эффективность, чем его аналогичный for-цикл.

commaccelerationreportresults(N,a,d,str);

Сводные данные

Комбинированные эффекты

  • Системные объекты,

  • MATLAB для Генерации кода C и

  • Параллельная обработка выполняется

может значительно ускорить симуляции ваших алгоритмов связи.

  • Системные объекты помогают улучшить скорость симуляции, выполняя обработку параметров и инициализацию только один раз за пределами цикла выполнения, используя эффективные реализации MEX системных объектов и избегая повторных стандартных программ валидации и верификации входов, найденных в функциональных алгоритмах.

  • MATLAB в Генерацию кода C ускоряет симуляцию, блокируя типы данных и размеры каждой переменной и уменьшая накладные расходы интерпретируемого языка, который проверяет размер и тип данных переменных в каждой строке кода.

  • Параллельные запуски обработки могут существенно ускорить симуляцию, вычисляя различные итерации вашего алгоритма одновременно для множества доступных работники MATLAB.

Дальнейшие исследования

В этом примере мы используем функцию parpool чтобы зарезервировать ряд работников MATLAB, которые запускаются локально на нашей клиентской машине MATLAB. Изменив параллельные строения, можно ускорить симуляцию еще дальше, запустив алгоритм на большем кластере рабочих мест, которых нет на вашей клиентской машине MATLAB. Описание того, как управлять и использовать параллельные строения, смотрите на странице «Программирование с Строениями пользователя» в Руководстве пользователя Parallel Computing Toolbox.

Примечание по числовой эффективности

В этом примере базовая и Системные объекты версии алгоритма не являются численно идентичными. Определяемая пользователем функция localmimodecoder, используемая в алгоритме базового уровня, реализует несколько другую версию операции декодирования блока пространства-времени MIMO, чем та, которая используется в Системный объект comm.OSTBCCombiner второй версии алгоритма. Тем не менее, когда вы запускаете каждую из первых трёх версий алгоритма (базовую версию, Системный объект версию и MEX-функцию второй версии) с достаточно большим количеством входа бит, вы получите очень похожие BER-кривые, указывающие аналогичную числовую эффективность для разных версий алгоритма. Здесь вы найдете кривые BER, полученные при запуске каждой из трех версий алгоритма с количеством входных бит, установленным на десять миллионов (то есть MaxNumBits = 1e7).

Приложение

В этом примере используются следующие функции.

Выбранные ссылки

  1. S. M. Alamouti, «Простой метод разнесения передачи для радиосвязей», IEEE ® Journal on Selected Areas in Communications, vol. 16, no. 8, pp. 1451-1458, Oct. 1998.

  2. В. Тарох, Х. Джафархами, и А. Р. Калдербанк, «Пространственно-временные блочные коды из ортогональных проектов», Транзакции IEEE по теории информации, том 45, № 5, стр. 1456-1467, Jul. 1999.