主要内容

使用Lapack呼叫加快生成的独立代码中的线性代数

为了提高独立(库或可执行程序)代码中为某些线性代数函数生成的代码的执行速度,请指定您想要的MATLAB®编码器™生成LAPACK调用。LAPACK是一个数值线性代数的软件库。MATLAB编码器使用Lapacke.C接口到LAPACK。如果您指定要生成LAPACK调用,并且线性代数函数的输入数组满足特定的条件,那么代码生成器将生成LAPACK调用。否则,代码生成器将为线性代数函数生成代码。

对于独立代码中的LAPACK调用,MATLAB编码器使用您指定的LAPACK库。指定针对执行环境优化的LAPACK库。看www.netlib.org/lapack/faq.html _what_and_where_are_the_lapack_vendors_implementations

指定LAPACK图书馆

要在独立代码中生成LAPACK调用,您必须访问LAPACK回调类。LAPACK回调类指定LAPACK调用的LAPACK库和LAPACKE头文件。要指示您想要生成LAPACK调用并且想要使用一个特定的LAPACK库,请指定LAPACK回调类的名称。

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

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

写Lapack回调类

要指定特定Lapack库和Lapacke头文件的位置,请写一个Lapack回调类。与想要使用此Lapack库的其他人共享回调类,以便在独立代码中调用Lapack呼叫。

回调类必须从抽象类派生编码器。LAPACKCallback.使用下面的示例回调类作为模板。

classdefuseMyLAPACK <编码器。LAPACKCallback方法(静止的)功能hn = getHeaderFilename(“mylapacke_custom.h”结束功能UpdateBuildInfo(BuildInfo,BuildCtX)BuildInfo.addincludePaths(FullFile(PWD,“包括”));libname ='mylapack';libPath = fullfile (pwd,“自由”);[~, linkLibExt] = buildctx.getStdLibInfo ();buildInfo。libPath addLinkObjects([库名linkLibExt),...'',真实,真实);buildInfo.addDefines (“HAVE_LAPACK_CONFIG_H”);buildInfo.addDefines (“LAPACK_COMPLEX_STRUCTURE”);buildInfo.addDefines (“LAPACK_ILP64”);结束结束结束

你必须提供getHeaderFilenameupdateBuildInfo方法。的getHeaderFilename方法返回LAPACKE头文件名称。在回调类的例子中,替换mylapacke_custom.h用你的LAPACKE头文件的名字。的updateBuildInfo方法提供构建过程链接到Lapack库所需的信息。使用模板中的代码(类似代码)的代码指定标题文件的位置和LAPACK库的完整路径名。在回调类的例子中,替换mylapack你的LAPACK库的名字。

如果编译器只支持以结构形式表示的复金宝app杂数据类型,请在updateBuildInfo方法。

buildInfo.addDefines (“HAVE_LAPACK_CONFIG_H”);buildInfo.addDefines (“LAPACK_COMPLEX_STRUCTURE”);

您必须指定LAPACK库使用的整数类型。不指定此整数类型可能导致错误行为或崩溃。做以下其中之一:

  • 包括这些行updateBuildInfo方法。

    buildInfo.addDefines (“HAVE_LAPACK_CONFIG_H”);buildInfo.addDefines (“LAPACK_ILP64”);

  • 或者,您可以直接指定LAPACK库使用的整数类型。例如,如果整数类型为长长,将这一行包含在updateBuildInfo方法。

    buildInfo.addDefines ('lapack_int = long long');

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

此示例显示如何生成在特定LAPACK库中调用Lapack函数调用Lapack函数的代码。对于此示例,假设Lapack回调类useMyLAPACK指定要使用的LAPack库。

  1. 编写一个MATLAB函数,调用线性代数函数。例如,编写一个函数mysvd调用MATLAB函数圣言会

    功能s = mysvd (A)% # codegens =圣言();结束

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

    cfg = coder.config (“dll”);

  3. 指定LAPACK回调类useMyLAPACK

    cfg.customlapackcallback =.“useMyLAPACK”

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

  4. 生成的代码。指定输入一个是一个500×500阵的双打。

    codegenmysvdarg游戏{0 (500)}配置cfg-报告

如果一个足够大时,代码生成器生成LAPACK调用圣言会.这是对Lapack库函数的调用的示例圣言会

info_t = lapacke_dgesvd(lapack_col_major,'n','n',(lapack_int)500,(lapack_int)500和a [0],(lapack_int)500,&s [0],null,(lapack_int)1,null,(lapack_int)1,&superb [0]);

在执行环境中找到Lapack库

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

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

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

  • 在一个苹果系统,修改DYLD_LIBRARY_PATH环境变量或使用r链接选项。

指定r链接器选项,您可以使用构建信息addLinkFlags方法updateBuildInfo你的方法编码器。LAPACKCallback班级。例如,对于GCC编译器:

buildInfo.addLinkFlags (sprintf (' - wl rpath、“% s”,libPath));

另请参阅

相关话题

外部网站