【问题标题】:Use external BLAS and LAPACK libraries in a MATLAB mex file在 MATLAB mex 文件中使用外部 BLAS 和 LAPACK 库
【发布时间】:2013-12-12 12:58:41
【问题描述】:

我目前正在尝试为 MATLAB 的数值软件库构建一个接口。因此,我最终遇到了以下问题:

MATLAB 默认使用 64 位整数,其 BLAS 和 LAPACK 库(即 MKL)也仅支持 64 位整数。不幸的是,我想通过 mex 文件连接到 Matlab 的库仅使用 32 位整数及其依赖项。每当 mex 文件现在尝试从 BLAS 或 LAPACK 调用函数时,由于整数宽度不同,它会崩溃。

我尝试使用 32 位整数将我的 mex 文件与我自己的 BLAS 和 LAPACK 版本链接起来

mex  myinterface.c -largeArrayDims -llapack -lblas

链接器在 mex 文件中包含对这两个库的引用,但如果我现在从 MATLAB 调用它,它会崩溃。从回溯中,我了解到一个 LAPACK 调用会产生分段错误,这似乎是由不同的整数宽度引起的。此外,回溯告诉我是 MKL 导致了这个错误,而不是我链接到我的程序的 BLAS 和 LAPACK。

问题是:是否有可能将 mex 文件链接到其依赖项,以便它解析其中的符号而不是 MATLAB 中的符号,即使用给定的 BLAS 和 LAPACK 库?

备注:

  • MATLAB 2013
  • GCC 4.6
  • BLAS 和 LAPACK 库是动态的。

【问题讨论】:

  • 默认情况下,Matlab 使用 64 位 f-p 数字。诸如a = 23 之类的赋值给a 留下一个double。你有没有使用 Matlab 的其他类型成功过,eg a = int32(23)
  • 我不确定问题是你的想法。首先,64 位应用程序只能加载 64 位共享库。但是,如果您的意思是 MATLAB 定义的 mwIndexmwSize 类型是 32 位还是 64 位,那么请尝试使用 mex -compatibleArrayDims .. 进行编译。这将强制 32 位整数作为默认大小,即使在 64 位平台上也是如此。
  • 同样在编译期间,如果您没有明确指定自己的路径,链接器将查看 MATLAB 自己的 BLAS/LAPACK 版本,而不是您自己的。所以使用类似:mex -v -I/path/to/include -L/path/to/libs ...,甚至可能是mex -v CFLAGS='-I... -Wall $CFLAGS' LDFLAGS='-L.. -w $LDFLAGS' 更确定(或任何其他 GCC 选项使其更详细)
  • 最后一点:我记得曾经甚至可以替换为整个 MATLAB 会话加载的 BLAS/LAPACK 实现(我认为它是由环境变量或某处的配置文件控制的) ,因此您可以绕过英特尔 MKL 库并加载您自己的(ATLAS、OpenBLAS 等)。但我不确定它是否可能了,所以不要引用我的话:)
  • 这是我指的那个:stanford.edu/~echu508/matlab.html。就我个人而言,我从来没有这样做过。

标签: c matlab dynamic-linking


【解决方案1】:

我知道这个问题已经有一年了,但这可能对某人有用:

我相信,如果您预先加载动态链接库以强制使用它们(也许按照 Shai 的建议更改您的 LD_LIBRARY_PATH),您的问题将会得到解决。我不得不做一些类似的事情来强制使用某些库的特定版本。 LD_LIBRARY_PATH 适用于 external 库(例如 OpenCV),而 LD_PRELOAD 适用于 标准 库。在您的命令行中,输入以下内容:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/OpenCV/lib/:/path/to/SomethingElse/lib
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16:/path/to/libOtherStandardLibrary.so
matlab

这也有助于解决 stdc++ 对系统和 Matlab 有不同版本的问题(它带有自己的旧版本)。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多