Use Intel AVX2 Code Replacement Library to Generate SIMD Code from MATLAB Algorithms
Note
This workflow requires a MATLAB® Coder™ license and an Embedded Coder® license.
To generate SIMD code from MATLAB System objects, create a coder.config
(MATLAB Coder) object, set the CodeReplacementLibrary
property to 'DSP Intel AVX2-FMA (Windows)'
, 'DSP Intel
AVX2-FMA (Linux)'
, or 'DSP Intel AVX2-FMA (Mac)'
, and
use the object with the codegen
(MATLAB Coder) command.
Consider this MATLAB function that filters a random multichannel signal using the dsp.FIRFilter
System 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
Generate plain C code executable of this function using the
codegen
command.
cfg = coder.config('exe'); % provides starter main.c cfg.GenerateExampleMain = 'GenerateCodeAndCompile'; switch computer('arch') case 'glnxa64' codegen firsingle -config cfg -report -o firsingle_std case 'win64' codegen firsingle -config cfg -report -o firsingle_std.exe case 'maci64' codegen firsingle -config cfg -report -o firsingle_std case 'maca64' codegen firsingle -config cfg -report -o firsingle_std end
Measure the time it takes to run the generated executable.
tic;
system('firsingle_std');
tplain = toc
tplain = 1.1700
Generate AVX2 C code executable by setting the
CodeReplacementLibrary
parameter to either 'DSP Intel
AVX2-FMA (Windows)'
, 'DSP Intel AVX2-FMA (Linux)'
, or
'DSP Intel AVX2-FMA (Mac)'
, and calling the
codegen
command on the coder.config
object.
cfg = coder.config('exe'); switch computer('arch') case 'glnxa64' cfg.CodeReplacementLibrary = 'DSP Intel AVX2-FMA (Linux)'; case 'win64' cfg.CodeReplacementLibrary = 'DSP Intel AVX2-FMA (Windows)'; case 'maci64' cfg.CodeReplacementLibrary = 'DSP Intel AVX2-FMA (Mac)'; case 'maca64' cfg.CodeReplacementLibrary = 'DSP Intel AVX2-FMA (Mac)'; end cfg.GenerateExampleMain = 'GenerateCodeAndCompile'; % provides starter main.c switch computer('arch') case 'glnxa64' codegen firsingle -config cfg -report -o firsingle_avx2 case 'win64' codegen firsingle -config cfg -report -o firsingle_avx2.exe case 'maci64' codegen firsingle -config cfg -report -o firsingle_avx2 case 'maca64' codegen firsingle -config cfg -report -o firsingle_avx2 end
Measure the time it takes to run the generated executable.
tic;
system('firsingle_avx2');
tavx2 = toc
tavx2 = 0.2611
The generated SIMD code is around 4.5x faster compared to the plain C code on a Windows® 10 machine.
tplain/tavx2
ans = 4.4815
You can also generate a static library and a dynamic library by specifying the build
type as 'lib'
and 'dll'
, respectively.
cfg = coder.config('lib'); cfg.CodeReplacementLibrary = 'DSP Intel AVX2-FMA (Windows)'; codegen MATLABfunctionName -config cfg
cfg = coder.config('dll'); cfg.CodeReplacementLibrary = 'DSP Intel AVX2-FMA (Windows)'; codegen MATLABfunctionName -config cfg
MATLABfunctionName
is the MATLAB function that calls the System object you are trying to generate SIMD code from. For a list of System objects
that support SIMD code generation, see System objects in DSP System Toolbox that Support SIMD Code Generation.