Основанные на графическом процессоре Системные объекты смотрят и ведут себя во многом как другие Системные объекты в продукте Communications Toolbox™. Важное различие - то, что алгоритм выполняется на Графическом процессоре (GPU), а не на центральном процессоре. Используя графический процессор может ускорить вашу симуляцию.
Системные объекты для продукта Communications Toolbox расположены в comm
пакет и создается как:
H = comm.<object name>
Например, Система Декодера Витерби object™ создается как:
H = comm.ViterbiDecoder
В случаях, где соответствующая основанная на графическом процессоре реализация Системного объекта существует, они расположены в comm.gpu
пакет и созданный как:
H = comm.gpu.<object name>
Например, основанный на графическом процессоре Системный объект Декодера Витерби создается как:
H = comm.gpu.ViterbiDecoder
Видеть, что список доступных основанных на графическом процессоре реализаций вводит help comm
в MATLAB® командная строка и нажимает GPU Implementations.
Графические процессоры (графические процессоры) Excel при обработке больших количеств данных и выполнения расчетов с высоким вычисляют интенсивность. Обработка больших количеств данных является одним способом максимизировать пропускную способность вашего графического процессора в симуляции. Сумма данных, что процессы графического процессора в любой момент зависят от размера данных, передала входу Системного объекта графического процессора. Поэтому один способ максимизировать этот размер данных путем обработки нескольких кадров данных.
Можно использовать один Системный объект графического процессора, чтобы обработать несколько кадров данных одновременно или параллельно. Это отличается от пути многие из стандарта или неграфический процессор, Системные объекты реализованы. Для Системных объектов графического процессора количество кадров процесс объектов в одном вызове объектной функции или подразумевается одними из свойств объектов или явным образом утвердил использование NumFrames
свойство на объектах.
В этом примере показано, как передать закодированные турбо блоки данных по модулируемому BPSK каналу AWGN. Затем это показывает, как декодировать использование итеративных турбо ошибок декодера и отображения.
Задайте шумовую переменную, установите длину системы координат 256 и используйте случайное потоковое свойство так, чтобы результаты были повторяемы.
noiseVar = 4; frmLen = 256; s = RandStream('mt19937ar', 'Seed', 11); intrlvrIndices = randperm(s, frmLen);
Создайте Турбо Системный объект Энкодера. Структура решетки для составляющего сверточного кода является 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. 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 = 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
класс. Основанный на графическом процессоре Системный объект поддерживает входные сигналы с двойным - или типы данных с одинарной точностью. Выходной сигнал наследовал свой тип данных от входного сигнала.
Если входной сигнал является массивом MATLAB, Системный объект обрабатывает передачу данных между центральным процессором и графическим процессором. Выходной сигнал является массивом MATLAB.
Если входным сигналом является gpuArray
, данные остаются на графическом процессоре. Выходным сигналом является gpuArray
. Когда объекту дают gpuArray
, вычисления происходят полностью на графическом процессоре, и никакая передача данных не происходит. Передача gpuArray
аргументы обеспечивают увеличенную эффективность путем сокращения времени симуляции. Для получения дополнительной информации смотрите, Устанавливают Массивы на графическом процессоре (Parallel Computing Toolbox).
Передающие массивы MATLAB к Системному объекту графического процессора требуют передачи исходных данных с центрального процессора на графический процессор. Затем Системный объект графического процессора выполняет вычисления и возвращает выходные данные к центральному процессору. Этот процесс вводит задержку. Когда данные в форме gpuArray передаются Системному объекту графического процессора, объект не подвергается задержке от передачи данных. Поэтому Системный объект графического процессора запускается быстрее, когда вы предоставляете 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
Системные объекты графического процессора должны быть симулированы с помощью Interpreted Execution
. Необходимо выбрать эту опцию явным образом на маске блока; значением по умолчанию является Code generation
.