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

Этот пример показывает, как использовать основанную на графическом процессоре систему декодера LDPC object™ для повышения скорости симуляции коммуникационной системы. Повышение эффективности иллюстрируется моделированием части стандарта ETSI (European Telecommunications Standard Institute) EN 302 307 для вещания, интерактивных услуг, сбора новостей и других широкополосных спутниковых приложений (DVB-S.2) [1]. Для получения дополнительной информации об использовании системных объектов для симуляции DVB-S.2 системы смотрите DVB-S.2 Link, включая кодирование LDPC в Simulink. Для использования декодера LDPC на базе графического процессора необходимо иметь лицензию пользователя Parallel Computing Toolbox™.

Введение

Алгоритм декодирования LDPC является в вычислительном отношении дорогим и составляет подавляющее большинство времени, проведенного в симуляции DVB-S.2. Использование Системного объекта comm.gpu.LDPCDecoder для выполнения алгоритма декодирования на графическом процессоре резко улучшает симуляцию запуска времени. Пример моделирует DVB-S.2 систему, получая бенчмарк скорости (запуска), один раз с помощью декодера LDPC на базе CPU (comm.LDPCDecoder) и один раз с декодером LDPC на базе GPU (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 (Quadro P620, 4 multiprocessors, Compute Capability 6.1)

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

Функция getParamsDVBS2Demo.m генерирует структуру dvb, которая содержит информацию о строении для DVB-S.2 системы с учетом параметров ниже. Впоследствии пример включает в себя создание и конфигурирование системных объектов на основе структуры dvb.

Скрипт createSimObjDVBS2Demo.m создает большинство системных объектов, используемых в DVB-S.2, и конфигурирует их на основе структуры dvb.

Затем центральные процессоры 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 the LDPC Encoder
encldpc = comm.LDPCEncoder(dvb.LDPCParityCheckMatrix);

% Construct the LDPC Decoder System objects

% LDPC Decoder Configuration
ldpcPropertyValuePairs = { ...
    'MaximumIterationCount',dvb.LDPCNumIterations, ...
    'ParityCheckMatrix',dvb.LDPCParityCheckMatrix, ...
    'DecisionMethod','Hard Decision', ...
    'IterationTerminationCondition','Maximum iteration count', ...
    'OutputValue','Information part'};

% Construct the LDPC Decoder System objects (CPU and GPU versions)
decldpc = comm.LDPCDecoder(ldpcPropertyValuePairs{:});
if doGPU
    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 систему, используя сначала основанный на CPU объект LDPC Decoder System, а затем основанный на GPU объект LDPC Decoder System. Пример получает системные бенчмарки для каждого декодера LDPC путем передачи нескольких систем координат данных через систему и измерения общего времени системной симуляции. Первая система координат данных несёт большое время инициализации симуляции, и так, он исключен из вычислений бенчмарка. Количество системы координат и среднее время системной симуляции печатаются в Командном окне. Вероятность битовой ошибки (BER) системы также печатается в Командном окне, чтобы проиллюстрировать, что декодеры LDPC на базе CPU и GPU достигают того же 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';
        decoder = decldpc; % 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 = encldpc(bchencOut);
        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 whichever LDPC Decoder was set above.
        ldpcdecOut = decoder(dexlvrOut);
        
        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.17 sec  Frame 2 decode : 0.17 sec  Frame 3 decode : 0.17 sec  Frame 4 decode : 0.19 sec  Frame 5 decode : 0.15 sec  Frame 6 decode : 0.17 sec  Frame 7 decode : 0.15 sec  Frame 8 decode : 0.17 sec  Frame 9 decode : 0.18 sec  Frame 10 decode : 0.15 sec
  10 frames decoded, 0.17 sec/frame
  Bit error rate: 0.00785634 
Using GPU-based LDPC Decoder:
  Initializing ...
  Frame 1 decode : 0.14 sec  Frame 2 decode : 0.13 sec  Frame 3 decode : 0.13 sec  Frame 4 decode : 0.14 sec  Frame 5 decode : 0.11 sec  Frame 6 decode : 0.13 sec  Frame 7 decode : 0.12 sec  Frame 8 decode : 0.14 sec  Frame 9 decode : 0.13 sec  Frame 10 decode : 0.12 sec
  10 frames decoded, 0.13 sec/frame
  Bit error rate: 0.00785634 
% Reset the random stream to the cached object
RandStream.setGlobalStream(original_rs);

Используя код, подобный тому, что показано выше, измерение частоты битовой ошибки было сделано автономным. Эффективность битовой ошибки декодеров LDPC на базе GPU и CPU идентична, как видно на этом графике.

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

Если использовался графический процессор, отобразите ускорение на основе среднего времени запуска DVB-S.2 системы с использованием декодера LDPC GPU по сравнению с декодером LDPC CPU.

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 1.32 times faster using the GPU-based LDPC Decoder.

Приложение

Этот пример использует скрипт createSimObjDVBS2Demo.m и функцию getParamsDVBS2Demo.m helper.

Избранная библиография

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