使用 BLAS 调用加快生成的独立代码中的矩阵运算

为了提高某些低级向量生成的代码的执行速度,并 矩阵运算(如矩阵乘法)在独立代码中,指定您 要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 标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值