【问题标题】:Generalizing to multiple BLAS/LAPACK Libraries推广到多个 BLAS/LAPACK 库
【发布时间】:2016-09-29 10:13:04
【问题描述】:

我正在用 C++ 开发一个线性代数工具,它严重依赖于矩阵乘法和分解(如 LU、SVD),旨在应用于大型矩阵。我使用英特尔 MKL 开发它以获得最佳性能,但我不想发布仅限英特尔 MKL 的版本,因为我认为它不适用于没有英特尔或不想安装 MKL 的人。相反,我应该发布一个不是英特尔 MKL 特定的更通用的代码,而是允许用户指定他们想要使用的 BLAS 和 LAPACK 的实现(例如 OpenBLAS 或 ATLAS)。

尽管函数原型在不同的实现中似乎是相同的,但有几个(帮助?)函数和类型是特定于英特尔 MKL 的。例如,我使用的是 MKL_INT 类型,还有 mkl_malloc。这个article 建议使用宏来重新定义类型,这也是我的第一个想法。我想我也会有标题的宏。

我相信编写与 BLAS/LAPACK 实现无关的代码是标准的,我想知道是否有比依赖宏更简洁的方法——特别是因为后者需要重新编译切换代码,does not seem to be necessary 用于我使用过的其他工具。

【问题讨论】:

    标签: c++ c lapack blas intel-mkl


    【解决方案1】:

    大多数依赖 BLAS/LAPACK 调用的科学代码与实现无关。他们通常要求仅根据需要链接库。

    您已经评论说函数原型在不同的实现中是相同的。这使您可以将原型放在一些 myblas.hmylapack.h 标头中,然后链接您想要使用的任何库。

    听起来您主要关心的是您用于 MKL 的特定于实现的东西。解决方案是不要使用这些东西。例如,像 MKL_INT 这样的 MKL 类型并不特殊。它们是 C 数据类型,已定义为允许在 MKL 提供的 LP32/LP64/ILP64 库之间进行泛化。见this table

    另外,mkl_malloc 之类的东西也没有什么特别之处。它是在 C 标准具有线程安全对齐分配之前引入的。事实上,这就是mkl_malloc 的全部内容。因此,只需使用 aligned_alloc,或者如果您不想提交 C11,请使用 _mm_mallocmemalign 等...

    另一方面,MKL 确实为未标准化的 BLAS/LAPACK 提供了一些有用的扩展(例如转置)。但是,这种类型的东西通常很容易通过特殊情况的 BLAS/LAPACK 调用来实现,或者很容易由您自己实现。如果您选择使用 MKL,它还具有内部线程,但是,许多 BLAS/LAPACK 库都提供此功能。

    【讨论】:

    • 这太好了,谢谢加文。对于 MKL 特有的头文件,例如 mkl.h 和 mkl_lapacke.h 怎么样?
    • 大多数人都有一个通用的 lapack.h/blas1.h/blas2.h/etc,你可以从任何实现中获取它并保存在你自己的代码库中。有些人选择在编译时将其指定给实现头文件(即` gcc -I$(MY_LAPACK_HEADER_DIR) ...`)。我通常选择前者......那么你不应该需要 mkl.h 来做任何事情
    • 您的后一个选项对我来说不是很清楚...您正在传递目录,但是您在哪里指定文件的实际名称(mkl.h)?在这种情况下你会使用宏吗?
    • 好吧,您不会使用 mkl.h,但您的源代码中会有标准的 #include "lapack.h",但将其包含在 Netlib 的/scalapack 的/MKL 的包含目录中。就像您通常对任何共享库所做的那样
    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2015-08-25
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多