主要内容

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

为了提高独立代码中某些低级向量和矩阵操作(例如矩阵乘法)生成的代码的执行速度,请指定您想要的马铃薯®编码器™生成布拉斯呼叫。Blas是一种用于低级向量和矩阵计算的软件库,具有多种高度优化的机器特定实现。代码生成器使用CBLAS.C界面到BLAS。如果指定要生成BLAS调用,并且矩阵函数的输入阵列符合某些条件,则代码生成器会产生BLAS调用。否则,代码生成器会为矩阵函数产生代码。

对于Blas呼叫独立代码,Matlab编码器使用您指定的BLAS库。指定A.Blas图书馆这针对您的执行环境进行了优化。

指定BLAS库

要在独立代码中生成BLAS调用,您必须访问BLAS回调类。BLAS Callback类指定Blas库,CBLAS头文件,特定CBLAS接口使用的某些C数据类型,以及构建过程的编译器和链接器选项。执行以下操作之一:

  • 在命令行,设置代码配置对象属性CustomBlascallback.到回调类的名称。

  • 在里面Matlab编码器应用程序,集自定义blas库回调到回调类的名称。

写Blas回调类

要在生成的代码中生成对特定BLA库的调用,请写出BLAS回调类。与想要使用此Blas库的其他人共享回调类,以便在独立代码中调用Blas调用。

回调类必须从抽象类中派生Coder.Blascallback.。此示例是回调类的实现mklcallback.与...集成英特尔MKL.窗户上的blas图书馆®平台。

Classdef.mklcallback 方法(静止的)功能UpdateBuildInfo(BuildInfo,〜)libpath = fullfile(pwd,'mkl''赢''lib''英特尔64');libpriority =.'';libprecompiled = true;liblinkonly = true;libs = {'mkl_intel_ilp64.lib''mkl_intel_thread.lib''mkl_core.lib'};buildinfo.addlinkObjects(libs,libpath,libproirity,libprecompiled,......Liblinkonly);buildinfo.addlinkObjects('libiomp5md.lib',fullfile(matlabroot,'bin'......'win64')Libpriority,Libprecompiled,Liblinkonly);buildinfo.addincludepaths(fullfile(pwd,'mkl''赢''包括'));buildinfo.addefines('-dmkl_ilp64');结尾功能头部名称= getheaderfilename()头部名称='mkl_cblas.h';结尾功能inttypename = getblasinttypename()inttypename ='mkl_int';结尾结尾结尾

你必须提供getheaderfilename.getblasinttypename., 和UpdateBuildInfo.方法。这getheaderfilename.方法返回CBLAS头文件名。如果您使用的是不同的Blas库,请更换mkl_cblas.h.使用CBLAS头文件的名称。这getblasinttypename.方法返回CBLAS接口使用的整数数据类型的名称。如果您使用的是不同的Blas库,请更换mkl_int.使用特定于CBLAS接口的整数数据类型的名称。这UpdateBuildInfo.方法提供构建过程链接到Blas库所需的信息。使用代码如示例回调类中的代码,指定标题文件的位置,blas库的完整路径名以及编译器和链接器选项。如果使用Intel MKL Blas库,请使用链接线顾问要查看您的用例建议使用哪些库和编译器选项。

还有三种已经实施的其他方法Coder.Blascallback.。这些方法是getblasdoublecomplextypename.getbrassinglecoMplextypename., 和Underenumnameratherthantypedef.。默认情况下,您的回调类继承了这些实现Coder.Blascallback.。在某些情况下,当您定义回调类时,您必须使用自己的定义覆盖这些方法。

getblasdoublecomplextypename.方法在生成的代码中返回用于双精度复杂变量的类型。如果您的Blas库需要除此之外的类型双倍的*空白*对于双重精度复杂阵列参数,请在回调类定义中包含此方法。

功能doublecomplextypename = getblasdoublecomplextypename()doublecomplextypename ='my_double_complex_type';结尾

代替my_double_complex_type.使用BLAS库需要双精度复杂阵列参数的类型。

getbrassinglecoMplextypename.方法返回生成的代码中用于单精度复杂变量的类型。如果您的Blas库需要除此之外的类型漂浮*空白*对于单精度复杂阵列参数,请在回调类定义中包含此方法。

功能singlecomplextypename = getbrassinglecomplextypename()doublecomplextypename ='my_single_complex_type';结尾

代替my_single_complex_type.使用Blas库需要单精度复杂阵列参数的类型。

Underenumnameratherthantypedef.方法退货错误的默认情况下。如果BLAS库中的枚举类型包括枚举关键字,重新定义此方法返回真的在您的回调类定义中。

功能p = Undenumnameraththantypedef()p = true;结尾

来自生成的C源代码的摘录,包括该源代码枚举关键字是:

enum cblas_side t;enum cblas_uplo b_t;双温度;枚举cblas_transoshes c_t;枚举cblas_diag d_t;

通过指定BLAS回调类来生成BLAS调用

此示例显示了如何生成调用特定BLA库中的函数的代码。blas回调类Usemyblas.指定在此示例中要使用的BLAS库。

  1. 写一个MATLAB函数,调用基本矩阵操作的函数。例如,写一个函数我多了该乘以两个矩阵一种B.

    功能c = multiply(a,b)%#codegen.c = a * b;结尾

  2. 为静态库,动态链接库或可执行程序定义代码配置对象。例如,在Windows平台上定义用于动态链接库的配置对象。

    cfg = coder.config('DLL');
  3. 指定BLAS回调类Usemyblas.

    cfg.customblascallballach ='usemyblas';

    回调类必须位于Matlab路径上。

  4. 生成代码。指定输入一种B.是1000×1000个双打阵列。

    Codegen.我多了-  args.{Zeros(1000),零(1000)}-Config.CFG.-报告

    如果一种B.足够大,代码生成器为矩阵乘法函数产生BLAS呼叫。

在执行环境中找到BLAS库

必须在执行环境中使用BLAS库。如果已共享BLAS库,请使用环境变量或链接器选项指定BLAS库的位置。

  • 在Windows平台上,修改路径环境变量。

  • 在Linux上®平台,修改LD_Library_Path环境变量或使用r链接选项。

  • 在A.苹果系统平台,修改Dyd_Library_Path环境变量或使用r链接选项。

指定r链接器选项,使用构建信息addlinkflags.方法中的方法UpdateBuildInfo.Blas回调类的方法。例如,对于GCC编译器:

buildinfo.addlinkflags(sprintf(' -  wl,-rpath,%s“',libpath));

OpenBlas库的使用说明和限制

如果生成包括调用的代码森林图书馆功能,遵循以下指南和限制:

  • 如果生成C ++代码,其中包含对OpenBlas库函数的调用,请使用该代码进行编译-选项产生警告。禁用-编译器选项,包括这些行UpdateBuildInfo.方法:

    如果ctx.gettargetlang()=='c ++'buildinfo.addcompileflags('-wno-poictant');结尾
  • OpenBlas不支持C89 / C金宝app90标准。

也可以看看

相关话题

外部网站