exponenta event banner

Ускорение моделирования с использованием графических процессоров

Системные объекты на основе GPU

Системные объекты на основе GPU выглядят и ведут себя так же, как другие системные объекты в продукте Communications Toolbox™. Важным отличием является то, что алгоритм выполняется на графическом процессоре (GPU), а не на ЦП. Использование графического процессора может ускорить моделирование.

Системные объекты для продукта Communications Toolbox расположены в comm пакет и сконструированы следующим образом:

H = comm.<object name>

Например, системный object™ декодера Витерби построен следующим образом:

H = comm.ViterbiDecoder

В случаях, когда существует соответствующая реализация объекта System на основе GPU, они располагаются в comm.gpu пакет и сконструирован следующим образом:

H = comm.gpu.<object name>

Например, объект системы декодера Витерби на основе GPU построен следующим образом:

H = comm.gpu.ViterbiDecoder

Для просмотра списка доступных реализаций на основе графического процессора введите help comm в командной строке MATLAB ® и щелкните Реализации графического процессора (GPU Implementations ).

Общие рекомендации по использованию графических процессоров

Графические блоки обработки данных (GPU) работают с большими объемами данных и выполняют вычисления с высокой вычислительной интенсивностью. Обработка больших объемов данных является одним из способов максимизации пропускной способности графического процессора при моделировании. Объем данных, обрабатываемых GPU в любой момент времени, зависит от размера данных, передаваемых на вход объекта системы GPU. Поэтому один из способов максимизировать этот размер данных заключается в обработке множества кадров данных.

Можно использовать один системный объект графического процессора для одновременной или параллельной обработки нескольких кадров данных. Это отличается от способа реализации многих стандартных системных объектов, не являющихся GPU. Для объектов системы GPU количество кадров, обрабатываемых объектами в одном вызове функции объекта, либо подразумевается одним из свойств объекта, либо явно указывается с помощью NumFrames свойства объектов.

Передача и декодирование с использованием модуляции BPSK и турбокодирования

Этот пример показывает, как передавать турбокодированные блоки данных по каналу AWGN, модулированному BPSK. Затем показано, как декодировать с помощью итеративного турбодекодера и отображать ошибки.

Определите переменную шума, установите длину кадра 256 и используйте свойство случайного потока, чтобы результаты были воспроизводимыми.

noiseVar = 4; frmLen = 256;
s = RandStream('mt19937ar', 'Seed', 11);
intrlvrIndices = randperm(s, frmLen);

Создайте объект Turbo Encoder System. Решетчатая структура для составного сверточного кода - poly2trellis (4, [13 15 17], 13). InterleaverIndices свойство определяет отображение, используемое объектом для перестановки входных битов в кодере в виде вектора столбцов целых чисел.

turboEnc = comm.TurboEncoder('TrellisStructure', poly2trellis(4, ...
      [13 15 17], 13), 'InterleaverIndices', intrlvrIndices);

Создайте объект системы модуляторов BPSK.

bpsk = comm.BPSKModulator;

Создайте объект системы каналов AWGN.

channel = comm.AWGNChannel('NoiseMethod', 'Variance', 'Variance', ...
      noiseVar);

Создайте объект системы турбодекодера на основе графического процессора. Решетчатая структура для составного сверточного кода - poly2trellis (4, [13 15 17], 13). InterleaverIndicies свойство определяет отображение, используемое объектом для перестановки входных битов в кодере в виде вектора столбцов целых чисел.

turboDec = comm.gpu.TurboDecoder('TrellisStructure', poly2trellis(4, ...
      [13 15 17], 13), 'InterleaverIndices', intrlvrIndices, ...
      'NumIterations', 4);

Создание объекта системы частоты ошибок.

errorRate = comm.ErrorRate;

Запустите моделирование.

for frmIdx = 1:8
 data = randi(s, [0 1], frmLen, 1);
 encodedData = turboEnc(data);
 modSignal = bpsk(encodedData);
 receivedSignal = channel(modSignal); 

Преобразуют принятый сигнал в логарифмические отношения правдоподобия для декодирования.

receivedBits  = turboDec(-2/(noiseVar/2))*real(receivedSignal));

Сравните исходные данные с полученными данными, а затем вычислите результаты частоты ошибок.

errorStats = errorRate(data,receivedBits);
end
fprintf('Error rate = %f\nNumber of errors = %d\nTotal bits = %d\n', ...
errorStats(1), errorStats(2), errorStats(3))

Обработка нескольких кадров данных с помощью графического процессора

В этом примере показано, как одновременно обрабатывать два кадра данных с помощью объекта LDPC Decoder System. ParityCheckMatrix свойство определяет размер кадра. Количество кадров, обрабатываемых объектом, определяется размером кадра и длиной вектора входных данных.

numframes = 2;
 
ldpcEnc = comm.LDPCEncoder;
ldpcGPUDec = comm.gpu.LDPCDecoder;
ldpcDec = comm.LDPCDecoder;
 
 
msg = randi([0 1], 32400,2);
 
for ii=1:numframes,
    encout(:,ii) = ldpcEnc(msg(:,ii));
end
 
%single ended to bipolar (for LLRs)
encout = 1-2*encout;
 
%Decode on the CPU
for ii=1:numframes;
    cout(:,ii) = ldpcDec(encout(:,ii));
end
 
%Multiframe decode on the GPU
gout = ldpcGPUDec(encout(:));
 
%check equality
isequal(gout,cout(:))

Обработка нескольких кадров данных с помощью свойства NumFrames

В этом примере показано, как обрабатывать несколько кадров данных с помощью NumFrames свойство объекта системы декодера Витерби на основе графического процессора. Для декодера Витерби размер кадра системы не может быть определен из свойства объекта. Следовательно, NumFrames свойство определяет количество кадров, присутствующих во входных данных.

numframes = 10;
 
convEncoder = comm.ConvolutionalEncoder('TerminationMethod', 'Terminated');
vitDecoder = comm.ViterbiDecoder('TerminationMethod', 'Terminated');
 
%Create a GPU Viterbi Decoder, using NumFrames property.
vitGPUDecoder = comm.gpu.ViterbiDecoder('TerminationMethod', 'Terminated', ...
                               'NumFrames', numframes );
 
msg = randi([0 1], 200, numframes);
 
for ii=1:numframes,
    convEncOut(:,ii) = 1-2*convEncoder(msg(:,ii));
end
 
%Decode on the CPU
for ii=1:numframes;
    cVitOut(:,ii) = vitDecoder(convEncOut(:,ii));
end
 
%Decode on the GPU
gVitOut = vitGPUDecoder(convEncOut(:));
 
isequal(gVitOut,cVitOut(:))

gpuArray и обычные числовые массивы MATLAB

Системный объект на основе GPU принимает типичные массивы или объекты MATLAB, созданные с помощью gpuArray класс. Системный объект на основе GPU поддерживает входные сигналы с типами данных с двойной или одинарной точностью. Выходной сигнал наследует тип данных из входного сигнала.

  • Если входной сигнал представляет собой матрицу MATLAB, объект System обрабатывает передачу данных между CPU и GPU. Выходной сигнал представляет собой матрицу MATLAB.

  • Если входной сигнал является gpuArrayданные остаются на GPU. Выходной сигнал представляет собой gpuArray. Когда объекту присваивается значение gpuArrayвычисления выполняются полностью на GPU, и передача данных не происходит. Прохождение gpuArray аргументы обеспечивают повышение производительности за счет сокращения времени моделирования. Дополнительные сведения см. в разделе Создание массивов на графическом процессоре (панель инструментов параллельных вычислений).

Передача массивов MATLAB объекту системы GPU требует передачи исходных данных из CPU в GPU. Затем объект GPU System выполняет вычисления и передает выходные данные обратно в CPU. Этот процесс вводит задержку. Когда данные в форме gpuArray передаются объекту GPU System, объект не задерживает передачу данных. Поэтому объект GPU System работает быстрее при вводе gpuArray.

В целом, при моделировании следует попытаться минимизировать объем передачи данных между CPU и графическим процессором.

Передать gpuArray в качестве входных данных

В этом примере показано, как передать gpuArray на вход модулятора PSK, уменьшая задержку.

pskGPUModulator = comm.gpu.PSKModulator;
x = randi([0 7], 1000, 1, 'single');
gx = gpuArray(x);
 
o = pskGPUModulator(x);
class(o)
 
release(pskGPUModulator); %allow input types to change
 
go = pskGPUModulator(gx);
class(go)

Поддержка системных блоков для системных объектов GPU

Системные объекты GPU, поддерживаемые в системном блоке

  • comm.gpu.AWGNChannel

  • comm.gpu.BlockDeinterleaver

  • comm.gpu.BlockInterleaver

  • comm.gpu.ConvolutionalDeinterleaver

  • comm.gpu.ConvolutionalEncoder

  • comm.gpu.ConvolutionalInterleaver

  • comm.gpu.PSKDemodulator

  • comm.gpu.PSKModulator

  • comm.gpu.TurboDecoder

  • comm.gpu.ViterbiDecoder

Ограничения системных блоков для системных объектов GPU

Объекты системы GPU должны быть смоделированы с помощью Interpreted Execution. Необходимо явно выбрать этот параметр на маске блока; значением по умолчанию является Code generation.

Связанные темы