exponenta event banner

Моделирование BER с помощью инструментария параллельных вычислений

В этом примере показано, как улучшить скорость выполнения систем связи, использующих моделирование BER. Для повышения производительности этих систем одной из доступных опций является параллелизация моделирования. В этом примере описывается использование Toolbox™ параллельных вычислений (PCT) в моделировании BER. В нем представлены два возможных способа параллелизации моделирования BER и рекомендуется лучший метод.

Проверка лицензии и открытие параллельного пула

В этом разделе проверяется доступность PCT. Если он доступен, он открывает параллельный пул работников и назначает максимальное количество доступных работников в пуле переменной numWorkers. Если он недоступен, ему присваивается значение numWorkers = 1, и в этом случае пример выполняется на одном ядре.

[licensePCT,~] = license( 'checkout','Distrib_Computing_Toolbox');
if ( licensePCT && ~isempty(ver('parallel')))
    if isempty(gcp('nocreate'))
        parpool;
    end
    pool = gcp;
    numWorkers = pool.NumWorkers;
else
    numWorkers = 1;
end
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).

Инициализация

Этот пример параллелизирует пример пространственного мультиплексирования для демонстрации использования PCT. Ниже приведены параметры, необходимые для моделирования этого примера.

EbNo = 1:2:11;  % Eb/No in dB
N = 2;          % Number of transmit antennas
M = 2;          % Number of receive antennas
modOrd = 2;     % constellation size = 2^modOrd
numBits = 1e6;  % Number of bits
numErrs =  100; % Number of errors
lenEbNo = length(EbNo);
% Create a local random stream to be used for data generation for
% repeatability. Use the combined multiple recursive generator since it
% supports substreams.
hStr = RandStream('mrg32k3a'); % Setting the random stream
[berZF,berMMSE] = deal(zeros(lenEbNo,3));
[nerrsZF,nbitsZF,nerrsMMSE,nbitsMMSE] = deal(zeros(numWorkers,lenEbNo));

Параллелизация в диапазоне Eb/No

Первый метод параллелизуется по диапазону Eb/No, где один работник обрабатывает одно значение Eb/No. Здесь производительность ограничена временем, необходимым для обработки наибольшего значения Eb/No.

simIndex = 1;
str = 'Across the Eb/No range';
disp('Performing BER simulations with one worker processing one Eb/No value ...');
Performing BER simulations with one worker processing one Eb/No value ...
tic
parfor idx = 1:lenEbNo
    [BER_ZF,BER_MMSE] = simBERwithPCT(N,M,EbNo,modOrd, ...
        idx,hStr,numBits,numErrs);
    berZF(idx,:) = BER_ZF(idx,:);
    berMMSE(idx,:) = BER_MMSE(idx,:);
end
timeRange = toc;
clockBERwithPCT(simIndex,timeRange,timeRange,str);

Параллелизация числа работников в параллельном пуле

Второй метод параллелизуется по количеству доступных работников, где каждый работник обрабатывает полный диапазон Eb/No. Однако каждый работник перед переходом к следующему значению Eb/No подсчитывает (всего ошибок/numWorks) ошибки. Этот метод использует все доступные ядра одинаково эффективно.

simIndex = simIndex + 1;
str = 'Across the number of available workers';
seed = 0:numWorkers-1;
disp('Performing BER simulations with each worker processing the entire range ...');
Performing BER simulations with each worker processing the entire range ...
tic
parfor n = 1:numWorkers
    hStr = RandStream('mrg32k3a','Seed',seed(n));
    for idx = 1:lenEbNo
        [BER_ZF,BER_MMSE] = simBERwithPCT(N,M,EbNo,modOrd, ...
            idx,hStr,numBits/numWorkers,numErrs/numWorkers);
        nerrsZF(n,idx) = BER_ZF( idx,2);
        nbitsZF(n,idx) = BER_ZF( idx,3);
        nerrsMMSE(n,idx) = BER_MMSE(idx,2);
        nbitsMMSE(n,idx) = BER_MMSE(idx,3);
    end
end
bZF = sum(nerrsZF,1)./sum(nbitsZF,1);
bMMSE = sum(nerrsMMSE,1)./sum(nbitsMMSE,1);
timeWorker = toc;

Ниже приведены результаты, полученные на компьютере под управлением Windows ® 10, 64-разрядного процессора Intel ® Xeon ® W-2133, 3.6GHz 64GB RAM с шестью ядрами. В таблице показано сравнение производительности вышеуказанных методов. Мы видим, что второй метод работает лучше, чем первый. Это результаты, полученные в одном прогоне, и они могут варьироваться от прогона к прогону.

--------------------------------------------------------------------------------------------
Type of Parallelization                             | Elapsed Time (sec)| Speedup Ratio
1. Across the Eb/No range                           |            1.9986 |       1.0000
2. Across the number of available workers           |            0.8362 |       2.3902
--------------------------------------------------------------------------------------------

На графике ниже показаны кривые BER, полученные для приемников нулевого форсирования (ZF) и минимальной среднеквадратичной ошибки (MMSE) с использованием различных методов параллелизации.

plotBERwithPCT(EbNo,berZF(:,1),berMMSE(:,1),bZF,bMMSE);

Figure Spatial Multiplexing contains an axes. The axes with title 2x2 Uncoded QPSK System contains 8 objects of type line. These objects represent BER-ZF with parallelization across Eb/No, BER-MMSE with parallelization across Eb/No, BER-ZF with parallelization across workers, BER-MMSE with parallelization across workers.

Чтобы создать таблицу сравнения производительности для компьютера, раскомментируйте следующую строку кода и запустите весь сценарий.

% clockBERwithPCT(simIndex,timeRange,timeWorker,str);

Приложение

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