LAPACKE 加速框架

问题描述 投票:0回答:1

我正在开发一个基于 C++ 的线性代数工具,允许用户链接到不同操作系统上的 OpenBLAS/ATLAS/Intel MKL。 这在 Windows 和 Linux 上都很好,但我更愿意允许 OS X 用户也链接到 Accelerate Framework。 但是,我的代码使用LAPACKE,它是 LAPACK 的 C 接口(例如,函数是 LAPACKE_fxname),它似乎不是 Accelerate Framework 的一部分。 相反,它具有 CLAPACK f2c'd 函数(例如函数是 fxname_),它们具有不同的接口并使用列主存储。

由于我的其余代码适用于行优先,所以我宁愿不必将矩阵转换为列优先,以便我可以在 OS X 上使用 CLAPACK,但这是我唯一的选择吗? 也就是说,用LAPACKE开发跨平台软件时,有没有办法使用Accelerate Framework呢? 或者有什么技巧可以用来在行主数组上使用 CLAPACK 函数(也许只是传递“转置”标志来进行“不转置”操作?在我看来,行主矩阵以相同的方式存储作为转置的列顺序矩阵。)?

c++ lapack accelerate-framework
1个回答
1
投票

这个问题相当老了,所以我不知道,当时的情况如何。但自 Mac OS X v13.3 Ventura(2023 年 3 月)以来,Apple 更新了 Accelerate 框架中包含的 BLAS/LAPACK 库,以符合 Reference LAPACK v3.9.1 接口,并添加了 ILP64 接口。

编辑: 在 MacOS v15.0 Sequoia 中,Apple 更新了其 Accelerate 框架以符合参考 LAPACK v3.11.0。

这个新接口隐藏在预处理器定义的后面,分别定义

ACCELERATE_NEW_LAPACK
ACCELERATE_LAPACK_ILP64
[2],并且需要包含
Accelerate/Accelerate.h
头文件。

如果您可以控制源代码并且实际上可以包含头文件,那么这工作得很好。如果您想要编译和链接代码,但不(或不能)包含 Accelerate 标头(如 LAPACKE 或 Fortran 代码),则链接到 Accelerate 将失败,因为 Accelerate 框架中包含新接口的二进制符号不遵守标准 BLAS/LAPACK API。它们具有

$NEWLAPACK
$NEWLAPACK$ILP64
后缀,而不是标准的
_
后缀。

您可以通过使用 Apple 系统链接器

-alias
-alias_list
/usr/bin/ld
选项来解决此问题。我创建了一个 sample CMake 项目,它从 Accelerate BLAS/LAPACK 基于文本的
$NEWLAPACK
存根中提取所有
$NEWLAPACK$ILP64
.dylib
符号名称,并构建所需的别名列表文件。它成功构建了 Reference LAPACKE 库并将其链接到 Accelerate 框架,但生成的别名文件也可以轻松用于链接其他项目到 Accelerate 框架!

© www.soinside.com 2019 - 2024. All rights reserved.