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