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

Системные объекты на базе графического процессора

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

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

H = comm.<object name>

Для примера object™ системы декодера Viterbi строится как:

H = comm.ViterbiDecoder

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

H = comm.gpu.<object name>

Для примера декодер Viterbi на базе GPU Системного объекта сконструирован как:

H = comm.gpu.ViterbiDecoder

Чтобы увидеть список доступных реализаций на основе GPU, введите help comm в MATLAB® Командная строка и нажатие кнопки GPU Implementations.

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

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

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

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

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

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

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

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

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

Создайте объект BPSK Modulator System.

bpsk = comm.BPSKModulator;

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

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

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

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

Создайте объект Error Rate System.

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. The 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 свойство объекта Viterbi Decoder System на базе GPU. Для декодера Viterbi формата кадра вашей системы не могут быть выведены из свойства объекта. Поэтому 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

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

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

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

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

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

Передайте 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)

Поддержка системных блоков для системных объектов графический процессор

Системные объекты графический процессор, поддерживаемые в системном блоке

  • 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 System должны быть моделированы с помощью Interpreted Execution. Необходимо явно выбрать эту опцию на маске блока; значение по умолчанию является Code generation.

Похожие темы