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

В этом примере показано, как использовать основанную на графическом процессоре Систему Декодера LDPC object™, чтобы увеличить скорость симуляции системы связи. Этот пример иллюстрирует увеличение производительности путем моделирования части ETSI (Европейский институт стандартизации электросвязи) EN 302 307 стандарт для Широковещательной передачи, Interactive Services, Сбора Новостей и других широкополосных спутниковых приложений (DVB-S.2) [1]. Для получения дополнительной информации об использовании Системных объектов, чтобы симулировать систему DVB-S.2 смотрите этот пример. У вас должна быть пользовательская лицензия Parallel Computing Toolbox™, чтобы использовать основанный на графическом процессоре Декодер LDPC.

Введение

LDPC Декодирование алгоритма является в вычислительном отношении дорогим и составляет подавляющее большинство времени, проведенного в симуляции DVB-S.2. Используя Системный объект comm.gpu.LDPCDecoder, чтобы выполнить алгоритм декодирования на графическом процессоре существенно улучшает время выполнения симуляции. Пример симулирует систему DVB-S.2, получая сравнительный тест для скорости (время выполнения), однажды с основанным на центральном процессоре Декодером LDPC (коммуникация. LDPCDecoder) и однажды с основанным на графическом процессоре Декодером LDPC (comm.gpu.LDPCDecoder). Пример получает частоту ошибок по битам для обеих версий, чтобы показать, что нет никакой потери в декодировании производительности с помощью графического процессора.

fprintf(...
  'DVB-S.2 Digital Video Broadcast Standard Bit Error Rate Simulation\n\n');

fprintf(...
  'Performance comparison of CPU- and GPU- accelerated decoders.\n');

Обнаружение присутствия графического процессора

Пример пытается запросить графический процессор, чтобы обнаружить пользовательскую лицензию 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

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

Функция 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 с помощью основанного на центральном процессоре Системного объекта Декодера 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';
        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

% 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

Приложение

Этот пример использует следующий скрипт и функцию помощника:

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

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

Для просмотра документации необходимо авторизоваться на сайте