Системные объекты на базе графического процессора выглядят и ведут себя так же, как и другие системные объекты в продукте 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
свойство объектов.
Этот пример показывает, как передать турбокодированные блоки данных по каналу 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
свойство объекта 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(:))
Системный объект на базе графического процессора принимает типичные массивы 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 на вход 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 System должны быть моделированы с помощью Interpreted Execution
. Необходимо явно выбрать эту опцию на маске блока; значение по умолчанию является Code generation
.