Системная симуляция DVB-S.2 Используя основанный на графическом процессоре системный объект декодера LDPC

В этом примере показано, как использовать основанную на графическом процессоре Систему Декодера 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 функцию помощника.

Выбранная библиография

  1. EN 302 307 V1.1.1 Стандарта ETSI: Цифровое телевидение (DVB); структура структурирования Второго поколения, кодирование канала и системы модуляции для Широковещательной передачи, Interactive Services, Нового Сбора и других широкополосных спутниковых приложений (DVB-S.2), Европейский институт стандартизации электросвязи, Вальбонн, Франция, 2005-03.