Основанные на графическом процессоре Системные объекты смотрят и ведут себя во многом как другие Системные объекты в продукте 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 %Mulitframe 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
.