主要内容

使用LAPACK调用在生成的独立代码中加速线性代数

要提高在独立(库或可执行程序)代码中为某些线性代数函数生成的代码的执行速度,请指定所需的代码MATLAB®编码器™生成LAPACK调用。LAPACK是一个用于数值线性代数的软件库。MATLAB编码器使用LAPACKEC接口到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,“包括”));库名=“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”);结束结束结束

你必须提供getHeaderFilename而且updateBuildInfo方法。的getHeaderFilename方法返回LAPACKE头文件名。在示例回调类中,replacemylapacke_custom.h与您的LAPACKE头文件的名称。的updateBuildInfo方法提供构建过程链接到LAPACK库所需的信息。使用与模板中的代码类似的代码来指定头文件的位置和LAPACK库的完整路径名。在示例回调类中,replacemylapack使用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 =很久”);

通过指定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 = LAPACK_COL_MAJOR (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环境变量或使用rpath链接器选项。

  • 在一个macOS平台,修改DYLD_LIBRARY_PATH环境变量或使用rpath链接器选项。

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

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

另请参阅

相关的话题

外部网站