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

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

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