Сгенерируйте код SIMD из алгоритмов MATLAB в DSP System Toolbox

Чтобы сгенерировать SIMD код из MATLAB® Системные объекты, создайте coder.config (MATLAB Coder), установите CodeReplacementLibrary свойство к 'Intel AVX (Windows)' или 'Intel AVX (Linux)', и использовать его с codegen (MATLAB Coder) команда.

Этот рабочий процесс требует установки MATLAB Coder™ и Embedded Coder® на вашей машине.

Рассмотрим эту функцию MATLAB, которая фильтрует случайный многоканальный сигнал, используя dsp.FIRFilter Системные object™.

function y = firsingle()

persistent fir
if isempty(fir)
    b = fir1(250,.4);
    fir = dsp.FIRFilter(b);    
end

frameSize = 512;
numChannels = 8;
numFrames = 1e3;

for k = 1:numFrames
    x = randn(frameSize,numChannels,'single');
    y = fir(x);
end

Сгенерируйте простой исполняемый код С этой функции, используя codegen команда.

cfg=coder.config('exe');
% provides starter main.c
cfg.GenerateExampleMain='GenerateCodeAndCompile';
if isunix
    codegen firsingle -config cfg -report -o firsingle_std    
elseif ispc
    codegen firsingle -config cfg -report -o firsingle_std.exe    
end

Измерьте время, необходимое для запуска сгенерированного исполняемого файла.

tic; 
system('firsingle_std'); 
tplain = toc
tplain =

   1.2742

Сгенерируйте AVX2 код C путем установки CodeReplacementLibrary параметр в 'Intel AVX (Windows)' или 'Intel AVX (Linux)', и вызывая codegen команду на coder.config объект.

cfg=coder.config('exe');
if isunix
    cfg.CodeReplacementLibrary = 'Intel AVX (Linux)';
elseif ispc 
    cfg.CodeReplacementLibrary = 'Intel AVX (Windows)';
end
% provides starter main.c
cfg.GenerateExampleMain='GenerateCodeAndCompile'; 
if isunix
    codegen firsingle -config cfg -report -o firsingle_avx2
elseif ispc
    codegen firsingle -config cfg -report -o firsingle_avx2.exe    
end

Измерьте время, необходимое для запуска сгенерированного исполняемого файла.

tic; 
system('firsingle_avx2');
tavx2 = toc
tavx2 =

   0.3909

Сгенерированный SIMD-код примерно в 3,3 раза быстрее по сравнению с простым кодом С в Windows® 10 машина.

Можно также сгенерировать статическую библиотеку и динамическую библиотеку, задав тип сборки следующим 'lib' и 'dll', соответственно.

cfg=coder.config('lib');
cfg.CodeReplacementLibrary='Intel AVX (Windows)';
codegen {FunctionName.m} -config cfg  
cfg=coder.config('dll');
cfg.CodeReplacementLibrary='Intel AVX (Windows)';
codegen {FunctionName.m} -config cfg

FunctionName.m - функция MATLAB, которая вызывает системный объект, из которого вы пытаетесь сгенерировать код SIMD. Список системных объектов, поддерживающих генерацию кода SIMD, см. в разделе Системные объекты в DSP System Toolbox, которые Поддержка генерацию кода SIMD.

Похожие темы