В этом примере показано, как использовать основанную на графическом процессоре Систему Декодера LDPC object™, чтобы увеличить скорость симуляции системы связи. Повышение производительности проиллюстрировано путем моделирования части ETSI (Европейский институт стандартизации электросвязи) EN 302 307 стандарт для Широковещательной передачи, Interactive Services, Сбора Новостей и других широкополосных спутниковых приложений (DVB-S.2) [1]. Для получения дополнительной информации об использовании Системных объектов, чтобы симулировать систему DVB-S.2 смотрите Ссылку DVB-S.2, Включая LDPC, Кодирующий в Simulink. У вас должна быть пользовательская лицензия Parallel Computing Toolbox™, чтобы использовать основанный на графическом процессоре Декодер LDPC.
LDPC Декодирование алгоритма является в вычислительном отношении дорогим и составляет подавляющее большинство времени, проведенного в симуляции DVB-S.2. Используя comm.gpu. Системный объект LDPCDecoder, чтобы выполнить алгоритм декодирования на графическом процессоре существенно улучшает время выполнения симуляции. Пример симулирует систему DVB-S.2, получая сравнительный тест для скорости (время выполнения), однажды с основанной на центральном процессоре функцией декодера LDPC (ldpcDecode
) и однажды с основанным на графическом процессоре Декодером LDPC (comm.gpu.LDPCDecoder
). Пример получает частоту ошибок по битам для обеих версий, чтобы показать, что нет никакой потери в декодировании эффективности с помощью графического процессора.
fprintf(... 'DVB-S.2 Digital Video Broadcast Standard Bit Error Rate Simulation\n\n');
DVB-S.2 Digital Video Broadcast Standard Bit Error Rate Simulation
fprintf(... 'Performance comparison of CPU- and GPU- accelerated decoders.\n');
Performance comparison of CPU- and GPU- accelerated decoders.
Пример пытается запросить графический процессор, чтобы обнаружить пользовательскую лицензию Parallel Computing Toolbox и присутствие поддерживаемого графического процессора. Если графический процессор или Parallel Computing Toolbox недоступны, симуляция только для центрального процессора может быть выполнена.
try % Query the GPU dev = parallel.gpu.GPUDevice.current; % Print out information about the GPU that was found fprintf(... 'GPU detected (%s, %d multiprocessors, Compute Capability %s)\n',... dev.Name,dev.MultiprocessorCount,dev.ComputeCapability); % Include a GPU-based simulation. doGPU = true; catch % #ok<CTCH> % The GPU is not supported or not present, or the Parallel Computing %Toolbox was not present and licensed. Consider a CPU-only simulation. inp = input(['***NOTE: GPU not detected. ', ... 'Continue with CPU-only simulation? [Y]/N '],'s'); if strcmpi(inp, 'y') || isempty(inp) doGPU = false; else return; end end
GPU detected (Tesla V100-PCIE-32GB, 80 multiprocessors, Compute Capability 7.0)
Функция getParamsDVBS2Demo.m генерирует структуру, dvb, который содержит конфигурационную информацию для системы DVB-S.2, приведенной ниже параметры. Впоследствии, пример включает создание и конфигурирование Системных объектов, на основе dvb структуры.
createSimObjDVBS2Demo.m скрипт создает большинство Системных объектов, используемых в DVB-S.2, и конфигурирует их на основе dvb структуры.
Затем объект настройки декодера LDPC и основанный на графическом процессоре Системный объект Декодера LDPC создаются. Объект настройки декодера LDPC передается основанному на центральном процессоре ldpcDecode
функция, которая использует опции, эквивалентные используемым основанным на графическом процессоре Системным объектом Декодера LDPC.
% DVB-S.2 System Parameters subsystemType = 'QPSK 1/2'; % Constellation and LDPC code rate EsNodB = 0.75; % Energy per symbol to noise PSD ratio in dB numFrames = 10; % Number of frames to simulate maxNumLDPCIterations = 50; % LDPC Decoder iterations dvb = getParamsDVBS2Demo(subsystemType,EsNodB,maxNumLDPCIterations); % Create and configure the BCH Encoder and Decoder, Modulator, Demodulator, % AWGN Channel. createSimObjDVBS2Demo; % Construct an LDPC Encoder configuration object encoderCfg = ldpcEncoderConfig(dvb.LDPCParityCheckMatrix); % LDPC Decoder Configuration ldpcPropertyValuePairs = { ... 'MaximumIterationCount',dvb.LDPCNumIterations, ... 'ParityCheckMatrix',dvb.LDPCParityCheckMatrix, ... 'DecisionMethod','Hard Decision', ... 'IterationTerminationCondition','Maximum iteration count', ... 'OutputValue','Information part'}; % Construct an LDPC Decoder configuration object decoderCfg = ldpcDecoderConfig(dvb.LDPCParityCheckMatrix); if doGPU % Construct a GPU-based LDPC Decoder System object gpuLDPCDecoder = comm.gpu.LDPCDecoder(ldpcPropertyValuePairs{:}); end % Create an ErrorRate object to analyze the differences in bit error rate % between the CPU and GPU. BER = comm.ErrorRate;
Этот пример симулирует систему DVB-S.2 с помощью основанной на центральном процессоре функции Декодера LDPC сначала, и затем основанного на графическом процессоре Системного объекта Декодера LDPC. Пример получает системные сравнительные тесты для каждого Декодера LDPC путем передачи нескольких кадров данных через систему и измерения общего времени системной симуляции. Первая система координат данных подвергается большому времени инициализации симуляции, и таким образом, это исключено из вычислений сравнительного теста. На систему координат и средние времена системной симуляции распечатаны к Командному окну. Частота ошибок по битам (BER) системы также распечатана к Командному окну, чтобы проиллюстрировать, что и основанные на центральном процессоре и основанные на графическом процессоре Декодеры LDPC достигают того же BER.
if doGPU architectures = 2; else architectures = 1; end % Initialize run time results vectors runtime = zeros(architectures,numFrames); avgtime = zeros(1,architectures); % Seed the random number generator used for the channel and message % creation. This will allow a fair BER comparison between CPU and GPU. % Cache the original random stream to restore later. original_rs = RandStream.getGlobalStream; rs = RandStream.create('mrg32k3a','seed',25); RandStream.setGlobalStream(rs); % Loop for each processing unit - CPU and GPU for ii = 1:architectures % Do some initial setup for the execution loop if (ii == 1) arch = 'CPU'; % Use CPU LDPC Decoder else arch = 'GPU'; decoder = gpuLDPCDecoder;% Use GPU LDPC Decoder end % Reset the Error Rate object reset(BER); % Reset the random stream reset(rs); % Notice to the user that DVB-S.2 simulation is beginning. fprintf(['\nUsing ' arch '-based LDPC Decoder:\n']); dels = repmat('\b',1,fprintf(' Initializing ...')); % Main simulation loop. Run numFrames+1 times and ignore the first % frame (which has initialization overhead) for the run time % calculation. Use the first run for the BER calculation. for rr = 1:(numFrames+1) % Start timer ts = tic; % ***Create an input Message*** % msg = zeros(encbch.MessageLength, 1); msg(1:dvb.NumInfoBitsPerCodeword) = ... logical(randi([0 1],dvb.NumInfoBitsPerCodeword,1)); % ***Transmit*** % bchencOut = encbch(msg); ldpcencOut = ldpcEncode(bchencOut,encoderCfg); xlvrOut = intrlv(ldpcencOut,dvb.InterleaveOrder); modOut = pskModulator(xlvrOut); % ***Corrupt with noise*** % chanOut = chan(modOut); % ***Receive*** %y demodOut = pskDemodulator(chanOut); dexlvrOut = deintrlv(demodOut,dvb.InterleaveOrder); % Use the appropriate LDPC Decoder. if strcmp(arch,'CPU') ldpcdecOut = logical(ldpcDecode(dexlvrOut,decoderCfg,dvb.LDPCNumIterations,'DecisionType','hard','Termination','max','OutputFormat','info')); else ldpcdecOut = decoder(dexlvrOut); end bchdecOut = decbch(ldpcdecOut); % ***Compute BER *** % Calculate BER at output of LDPC, not BCH. ber = BER(logical(bchencOut),ldpcdecOut); % Stop timer runtime(ii, rr) = toc(ts); % Don't report the first frame with the initialization overhead. if (rr > 1) fprintf(dels); newCharsToDelete = fprintf(' Frame %d decode : %.2f sec', ... rr-1, runtime(ii,rr)); dels = repmat('\b',1,newCharsToDelete); end end % end of running a frame through the DVB-S.2 system. % Report the run time results to the Command Window. fprintf(dels); % Delete the last line printed out. % Calculate the average run time. Don't include frame 1 because it % includes some System object initialization time. avgtime(ii) = mean(runtime(ii,2:end)); fprintf(' %d frames decoded, %.2f sec/frame\n',numFrames,avgtime(ii)); fprintf(' Bit error rate: %g \n',ber(1) ); end % architecture loop
Using CPU-based LDPC Decoder:
Initializing ...
Frame 1 decode : 0.29 sec Frame 2 decode : 0.30 sec Frame 3 decode : 0.32 sec Frame 4 decode : 0.29 sec Frame 5 decode : 0.25 sec Frame 6 decode : 0.29 sec Frame 7 decode : 0.26 sec Frame 8 decode : 0.29 sec Frame 9 decode : 0.28 sec Frame 10 decode : 0.26 sec
10 frames decoded, 0.28 sec/frame
Bit error rate: 0.00785634
Using GPU-based LDPC Decoder:
Initializing ...
Frame 1 decode : 0.12 sec Frame 2 decode : 0.12 sec Frame 3 decode : 0.12 sec Frame 4 decode : 0.11 sec Frame 5 decode : 0.09 sec Frame 6 decode : 0.12 sec Frame 7 decode : 0.09 sec Frame 8 decode : 0.12 sec Frame 9 decode : 0.12 sec Frame 10 decode : 0.09 sec
10 frames decoded, 0.11 sec/frame
Bit error rate: 0.00785634
% Reset the random stream to the cached object
RandStream.setGlobalStream(original_rs);
Используя код, похожий на то, что показывают выше, немного измерения коэффициента ошибок было сделано оффлайновое. Эффективность частоты ошибок по битам графического процессора - и основанные на центральном процессоре Декодеры LDPC идентична, как замечено в этом графике.
Если графический процессор использовался, покажите ускорение на основе среднего времени выполнения системы DVB-S.2 с помощью Декодера LDPC графического процессора по сравнению с центральным процессором Декодер LDPC.
if ~doGPU fprintf('\n*** GPU not present ***\n\n'); else %Calculate system-wide speedup fprintf(['\nFull system simulation runs %.2f times faster using ' ... 'the GPU-based LDPC Decoder.\n\n'],avgtime(1) / avgtime(2)); end
Full system simulation runs 2.60 times faster using the GPU-based LDPC Decoder.
Этот пример использует createSimObjDVBS2Demo.m скрипт и getParamsDVBS2Demo.m функцию помощника.
EN 302 307 V1.1.1 Стандарта ETSI: Цифровое телевидение (DVB); структура структурирования Второго поколения, кодирование канала и системы модуляции для Широковещательной передачи, Interactive Services, Нового Сбора и других широкополосных спутниковых приложений (DVB-S.2), Европейский институт стандартизации электросвязи, Вальбонн, Франция, 2005-03.