为了提高独立代码中某些低级向量和矩阵操作(例如矩阵乘法)生成的代码的执行速度,请指定您想要的马铃薯®编码器™生成布拉斯呼叫。Blas是一种用于低级向量和矩阵计算的软件库,具有多种高度优化的机器特定实现。代码生成器使用CBLAS.C界面到BLAS。如果指定要生成BLAS调用,并且矩阵函数的输入阵列符合某些条件,则代码生成器会产生BLAS调用。否则,代码生成器会为矩阵函数产生代码。
对于Blas呼叫独立代码,Matlab编码器使用您指定的BLAS库。指定A.Blas图书馆这针对您的执行环境进行了优化。
要在独立代码中生成BLAS调用,您必须访问BLAS回调类。BLAS Callback类指定Blas库,CBLAS头文件,特定CBLAS接口使用的某些C数据类型,以及构建过程的编译器和链接器选项。执行以下操作之一:
在命令行,设置代码配置对象属性CustomBlascallback.
到回调类的名称。
在里面Matlab编码器应用程序,集自定义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;
此示例显示了如何生成调用特定BLA库中的函数的代码。blas回调类Usemyblas.
指定在此示例中要使用的BLAS库。
写一个MATLAB函数,调用基本矩阵操作的函数。例如,写一个函数我多了
该乘以两个矩阵一种
和B.
。
功能c = multiply(a,b)%#codegen.c = a * b;结尾
为静态库,动态链接库或可执行程序定义代码配置对象。例如,在Windows平台上定义用于动态链接库的配置对象。
cfg = coder.config('DLL');
指定BLAS回调类Usemyblas.
。
cfg.customblascallballach ='usemyblas';
回调类必须位于Matlab路径上。
生成代码。指定输入一种
和B.
是1000×1000个双打阵列。
Codegen.我多了- args.{Zeros(1000),零(1000)}-Config.CFG.-报告
如果一种
和B.
足够大,代码生成器为矩阵乘法函数产生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));
如果生成包括调用的代码森林图书馆功能,遵循以下指南和限制:
如果生成C ++代码,其中包含对OpenBlas库函数的调用,请使用该代码进行编译-
选项产生警告。禁用-
编译器选项,包括这些行UpdateBuildInfo.
方法:
如果ctx.gettargetlang()=='c ++'buildinfo.addcompileflags('-wno-poictant');结尾
OpenBlas不支持C89 / C金宝app90标准。