推广到多个BLAS/LAPACK库 我在C++中开发了一个线性代数工具,它依赖于矩阵乘法和分解(如卢,SVD),并被应用于大矩阵。我使用“英特尔MKL”开发它以获得最佳性能,但我不想发布仅限“英特尔MKL”的版本,因为我认为它不适用于没有英特尔或不想安装MKL的用户。相反,我应该发布一个更通用的代码,该代码不是特定于英特尔MKL的,而是允许用户指定希望使用的BLAS和LAPACK实现(例如OpenBLAS或ATLAS)

推广到多个BLAS/LAPACK库 我在C++中开发了一个线性代数工具,它依赖于矩阵乘法和分解(如卢,SVD),并被应用于大矩阵。我使用“英特尔MKL”开发它以获得最佳性能,但我不想发布仅限“英特尔MKL”的版本,因为我认为它不适用于没有英特尔或不想安装MKL的用户。相反,我应该发布一个更通用的代码,该代码不是特定于英特尔MKL的,而是允许用户指定希望使用的BLAS和LAPACK实现(例如OpenBLAS或ATLAS),c++,c,lapack,blas,intel-mkl,C++,C,Lapack,Blas,Intel Mkl,虽然不同实现的函数原型似乎相同,但有几种(helper?)函数和类型是特定于英特尔MKL的。例如,我使用的是MKL_INT类型,还有。这建议使用宏来重新定义类型,这也是我的第一个想法。我想我也会有宏的标题以及 我相信编写代码是标准的,这样它对BLAS/LAPACK实现是不可知的,我想知道是否有比依赖宏更干净的方法——特别是因为宏需要重新编译代码以切换,这对于我使用的其他工具来说 大多数依赖BLAS/LAPACK调用的科学代码都与实现无关。它们通常要求只在适当时链接库 您已经说过,不同实现的函数原

虽然不同实现的函数原型似乎相同,但有几种(helper?)函数和类型是特定于英特尔MKL的。例如,我使用的是MKL_INT类型,还有。这建议使用宏来重新定义类型,这也是我的第一个想法。我想我也会有宏的标题以及


我相信编写代码是标准的,这样它对BLAS/LAPACK实现是不可知的,我想知道是否有比依赖宏更干净的方法——特别是因为宏需要重新编译代码以切换,这对于我使用的其他工具来说

大多数依赖BLAS/LAPACK调用的科学代码都与实现无关。它们通常要求只在适当时链接库

您已经说过,不同实现的函数原型是相同的。这样,您就可以在一些
myblas.h
mylapack.h
标题中创建原型,然后链接您想要使用的库

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

另外,像
mkl_malloc
这样的东西也不特别。它是在C标准具有线程安全对齐alloc之前引入的。事实上,这就是mkl_malloc的全部。因此,只需使用
aligned\u alloc
,或者如果您不想使用C11,请使用
\u mm\u malloc
memalign
,等等


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

这非常好,谢谢Gavin。对于特定于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的include目录中包含它。就像您通常对任何共享库所做的那样