В этом примере показано, как улучшить скорость выполнения систем связи, использующих моделирование 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.
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);

Чтобы создать таблицу сравнения производительности для компьютера, раскомментируйте следующую строку кода и запустите весь сценарий.
% clockBERwithPCT(simIndex,timeRange,timeWorker,str);В этом примере используются следующие функции: