MATLAB: How to generate code with OpenBLAS routines in MATLAB Coder on Linux

blascallbackcodecodegengenerationmatlab coderopenblas

I am running MATLAB on Linux, and I have a MATLAB function, simplefn, shown below:
function [outputArg1] = simplefn(inputArg1,inputArg2)
outputArg1 = inputArg1 * inputArg2;
end
When I generate code for this function, I see code as follows in simplefn.c:
void simplefn(const double inputArg1[1000000], const double inputArg2[1000000],
       double outputArg1[1000000])
{
 double d;
 int i;
 int i1;
 int i2;
 for (i = 0; i < 1000; i++) {
  for (i1 = 0; i1 < 1000; i1++) {
   d = 0.0;
   for (i2 = 0; i2 < 1000; i2++) {
    d += inputArg1[i + 1000 * i2] * inputArg2[i2 + 1000 * i1];
   }
   outputArg1[i + 1000 * i1] = d;
  }
 }
}
However, I want the generated code to use OpenBLAS routines. How do I accomplish this?

Best Answer

To generate code for 'simplefn' using OpenBLAS routines, first define a MATLAB class openblascallback.m as shown below (adapted from the example in the documentation below). Note that the library shared object and header locations, as well as the header name, depend on the Operating System, and specific BLAS library or package installed:
 
classdef openblascallback < coder.BLASCallback
methods (Static)
function updateBuildInfo(buildInfo, buildctx)
libPriority = '';
libPreCompiled = true;
libLinkOnly = true;
libName = 'libopenblas.so';
libPath = fullfile('/usr/lib/x86_64-linux-gnu');
incPath = fullfile('/usr/include/x86_64-linux-gnu');
buildInfo.addLinkFlags('-lpthread');
buildInfo.addLinkObjects(libName, libPath, ...
libPriority, libPreCompiled, libLinkOnly);
buildInfo.addIncludePaths(incPath);
end
function headerName = getHeaderFilename()
headerName = 'cblas.h';
end
function intTypeName = getBLASIntTypeName()
intTypeName = 'blasint';
end
end
end
Then create the following Code Generation script simplefn_script.m:
% SIMPLEFN_SCRIPT  Generate static library simplefn from simplefn.


% Script generated from project 'simplefn.prj' on 04-Dec-2020.
% See also CODER, CODER.CONFIG, CODER.TYPEOF, CODEGEN.
%% Create configuration object of class 'coder.EmbeddedCodeConfig'.
cfg = coder.config('lib', 'ecoder', false);
cfg.GenerateReport = true;
cfg.Toolchain = 'GNU gcc/g++ | gmake (64-bit Linux)';
cfg.CustomBLASCallback = 'openblascallback';
%% Invoke MATLAB Coder.
codegen -config cfg simplefn -args {zeros(1000),zeros(1000)} -report
Running simplefn_script.m should successfully generate code with OpenBLAS routines. The simplefn.c now contains:
void simplefn(const double inputArg1[1000000], const double inputArg2[1000000],
       double outputArg1[1000000])
{
 cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, (blasint)1000, (blasint)
       1000, (blasint)1000, 1.0, &inputArg1[0], (blasint)1000,
       &inputArg2[0], (blasint)1000, 0.0, &outputArg1[0], (blasint)1000);
}
Related Question