为了提高某些低级向量生成的代码的执行速度,并 矩阵运算(如矩阵乘法)在独立代码中,指定您 要MATLAB Coder™®生成 BLAS 调用。BLAS 是一个用于低级向量和矩阵计算的软件库,它具有 几个高度优化的机器特定实现。代码生成器使用 CBLAS C 接口来 哎呀。如果指定要生成 BLAS 调用,并且 矩阵函数满足特定条件,代码生成器生成 BLAS 调用。 否则,代码生成器将为矩阵函数生成代码。
对于独立代码中的 BLAS 调用,MATLAB Coder 使用您指定的 BLAS 库。指定针对您的执行环境进行优化的 BLAS 库。
指定 BLAS 库
若要在独立代码中生成 BLAS 调用,必须有权访问 BLAS Callback 类。BLAS 回调类指定 BLAS 库、CBLAS 头文件、 特定 CBLAS 接口使用的某些 C 数据类型,以及编译器和 生成过程的链接器选项。执行下列操作之一:
在命令行中,将代码配置对象属性设置为回调的名称 类。CustomBLASCallback
在 MATLAB 中 Coder app,将 Custom BLAS library callback 设置为回调类的名称。
编写 BLAS 回调类
若要在生成的代码中生成对特定 BLAS 库的调用,请编写 BLAS 回调类。与希望在独立代码中使用此 BLAS 库进行 BLAS 调用的其他人共享回调类。
回调类必须派生自抽象类编码器。BLASCallback的。此示例是回调类的实现,用于与 Windows 平台上的英特尔 MKL BLAS 库集成。mklcallback®
classdef mklcallback < coder.BLASCallback
methods (Static)
function updateBuildInfo(buildInfo, ~)
libPath = fullfile(pwd,'mkl','WIN','lib','intel64');
libPriority = '';
libPreCompiled = true;
libLinkOnly = true;
libs = {'mkl_intel_ilp64.lib' 'mkl_intel_thread.lib' 'mkl_core.lib'};
buildInfo.addLinkObjects(libs, libPath, libPriority, libPreCompiled, ...
libLinkOnly);
buildInfo.addLinkObjects('libiomp5md.lib',fullfile(matlabroot,'bin', ...
'win64'), libPriority, libPreCompiled, libLinkOnly);
buildInfo.addIncludePaths(fullfile(pwd,'mkl','WIN','include'));
buildInfo.addDefines('-DMKL_ILP64');
end
function headerName = getHeaderFilename()
headerName = 'mkl_cblas.h';
end
function intTypeName = getBLASIntTypeName()
intTypeName = 'MKL_INT';
end
end
end
必须提供 、 和 方法。该方法返回 CBLAS 头文件 名字。如果您使用的是其他 BLAS 库,请替换为 CBLAS 头文件的名称。该方法返回 CBLAS 接口使用的整数数据类型的名称。如果你 正在使用不同的 BLAS 库,请替换为 特定于 CBLAS 接口的整数数据类型。该方法提供了 构建过程以链接到 BLAS 库。使用类似于示例中的代码的代码 callback 类指定头文件的位置,BLAS 的完整路径名 库,以及编译器和链接器选项。如果您使用英特尔 MKL BLAS 库,请使用 Link Line Advisor,用于查看哪些库和编译器选项 推荐用于您的用例。getHeaderFilenamegetBLASIntTypeNameupdateBuildInfogetHeaderFilenamemkl_cblas.hgetBLASIntTypeNameMKL_INTupdateBuildInfo
中已经实现了其他三种方法。这些方法是 、 和 。默认情况下,您的回调类 继承了这些实现。在某些 情况下,在定义时,必须使用自己的定义覆盖这些方法 你的回调类。coder.BLASCallbackgetBLASDoubleComplexTypeNamegetBLASSingleComplexTypeNameuseEnumNameRatherThanTypedefcoder.BLASCallback
该方法返回用于 生成代码中的双精度复变量。如果您的 BLAS 库采用 除 和 for 以外的类型 双精度复数组参数,将此方法包含在回调类中 定义。getBLASDoubleComplexTypeNamedoublevoid
function doubleComplexTypeName = getBLASDoubleComplexTypeName()
doubleComplexTypeName = 'my_double_complex_type';
end
替换为 BLAS 库采用的类型 用于双精度复数组参数。my_double_complex_type
该方法返回用于 生成代码中的单精度复变量。如果您的 BLAS 库采用 除 和 for 以外的类型 单精度复数组参数,将此方法包含在回调类中 定义。getBLASSingleComplexTypeNamefloatvoid
function singleComplexTypeName = getBLASSingleComplexTypeName()
doubleComplexTypeName = 'my_single_complex_type';
end
替换为 BLAS 库采用的类型 用于单精度复数组参数。my_single_complex_type
该方法返回 违约。如果 BLAS 库中的枚举类型包含关键字,请重新定义此方法以在回调类定义中返回。useEnumNameRatherThanTypedeffalseenumtrue
function p = useEnumNameRatherThanTypedef()
p = true;
end
包含关键字的生成 C 源代码的摘录如下:enum
enum CBLAS_SIDE t;
enum CBLAS_UPLO b_t;
double temp;
enum CBLAS_TRANSPOSE c_t;
enum CBLAS_DIAG d_t;
通过指定 BLAS 回调类生成 BLAS 调用
此示例演示如何生成在特定 BLAS 库中调用 BLAS 函数的代码。 BLAS 回调类指定 BLAS 库 想要在此示例中使用。useMyBLAS
编写一个 MATLAB 函数,该函数调用函数进行基本矩阵运算。 例如,编写一个乘法函数 两个矩阵和 .myMultiplyAB
function C = myMultiply(A,B) %#codegen
C = A*B;
end
动态定义静态库的代码配置对象 链接库或可执行程序。例如,定义配置 对象,用于 Windows 平台上的动态链接库。
cfg = coder.config('dll');
指定 BLAS 回调类 。useMyBLAS
cfg.CustomBLASCallback = 'useMyBLAS';
回调类必须位于 MATLAB 路径上。
生成代码。指定输入和 是 1000×1000 的双精度数组。AB
codegen myMultiply -args {zeros(1000),zeros(1000)} -config cfg -report
如果 和 足够大,则 代码生成器为矩阵乘法生成 BLAS 调用 功能。AB
在执行环境中找到 BLAS 库
BLAS 库必须在您的执行环境中可用。如果您的 BLAS 库是 shared,则使用环境变量或链接器选项来指定 BLAS 库的位置。
在 Windows 平台上,修改 PATH 环境变量。
在 Linux 平台上,修改 LD_LIBRARY_PATH 环境变量或 使用链接器选项。®rpath
在 macOS 平台上,修改 DYLD_LIBRARY_PATH 环境变量或 使用链接器选项。rpath
若要指定链接器选项,请使用 BLAS 回调类的方法中的 information 方法。为 示例,对于 GCC 编译器:rpathaddLinkFlagsupdateBuildInfo
buildInfo.addLinkFlags(sprintf(‘-Wl,-rpath,“%s”’,libPath));
OpenBLAS 库的使用说明和限制
如果生成的代码包含对 OpenBLAS 库函数的调用,请按照以下步骤操作 这些准则和限制:
如果生成包含对 OpenBLAS 库函数的调用的 C++ 代码, 使用该选项编译它会产生警告。自 禁用编译器选项,将这些行包含在 方法:-pedantic-pedanticupdateBuildInfo
if ctx.getTargetLang() == 'C++'
buildInfo.addCompileFlags('-Wno-pedantic');
end
OpenBLAS 不支持 C89/C90 标准。