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

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

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

В этом примере показано, как передать закодированные турбо блоки данных по модулируемому 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 свойство задает количество систем координат, существующих во входных данных.

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 класс. Основанный на графическом процессоре Системный объект поддерживает входные сигналы с двойным - или типы данных с одинарной точностью. Выходной сигнал наследовал свой тип данных от входного сигнала.

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

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

Передающие массивы MATLAB к Системному объекту графического процессора требуют передачи исходных данных с центрального процессора на графический процессор. Затем Системный объект графического процессора выполняет вычисления и возвращает выходные данные к центральному процессору. Этот процесс вводит задержку. Когда данные в форме gpuArray передаются Системному объекту графического процессора, объект не подвергается задержке от передачи данных. Поэтому Системный объект графического процессора запускается быстрее, когда вы предоставляете 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.

Похожие темы