推广到多个BLAS/LAPACK库
Generalizing to multiple BLAS/LAPACK Libraries
我正在C++中开发一个线性代数工具,该工具在很大程度上依赖于矩阵乘法和分解(如LU、SVD),旨在应用于大型矩阵。我使用"英特尔MKL"开发了它,以获得最高性能,但我不想发布仅限"英特尔MKL"的版本,因为我认为它不适用于没有英特尔或不想安装MKL的人。相反,我应该发布一个更通用的代码,它不是英特尔MKL专用的,而是允许用户指定要使用哪种BLAS和LAPACK实现(例如OpenBLAS或ATLAS)。
尽管函数原型在不同的实现中似乎是相同的,但有几种(helper?)函数和类型是"英特尔MKL"特有的。例如,我使用的是MKL_INT类型,还有MKL_malloc。这篇文章建议使用宏来重新定义类型,这也是我的第一个想法。我想我也会有宏的标题。
我相信,代码的编写是标准的,这样它对BLAS/LAPACK实现是不可知的,我想知道是否有比依赖宏更干净的方法——特别是因为后者需要重新编译代码才能切换,而这对于我使用过的其他工具来说似乎没有必要。
大多数依赖BLAS/LAPACK调用的科学代码与实现无关。他们通常要求在适当的时候链接库。
您已经说过,函数原型在不同的实现中是相同的。这允许您只在一些myblas.h
和mylapack.h
标头中拥有原型,然后链接您想要使用的任何库。
听起来,您主要关心的是用于MKL的特定于实现的东西。解决办法就是不使用这些东西。例如,像MKL_INT
这样的MKL类型并不特殊。它们是C数据类型,已定义为允许在MKL提供的LP32/LP64/ILP64库之间进行泛化。请参阅此表。
此外,像mkl_malloc
这样的东西也不特别。它是在C标准具有线程安全对齐分配之前引入的。事实上,这就是mkl_malloc
的全部。因此,只需使用aligned_alloc
,或者如果您不想提交到C11,请使用_mm_malloc
、memalign
等。
另一方面,MKL确实为BLAS/LAPACK提供了一些有用的扩展,这些扩展没有标准化(例如转座)。然而,这种类型的东西通常很容易通过特殊情况下的BLAS/LAPACK调用来实现,或者很容易自己实现。如果您选择使用MKL,它也有内部线程,但是,许多BLAS/LAPACK库都提供这种功能。
- 直接在RcppArmadillo中调用LAPACK例程
- Armadillo正在为共享的lapack库获取未定义的参考
- LAPACK函数在第一次迭代后变慢
- BLAS 2 级波段矩阵向量积多个向量
- 有没有一种算法可以将 LAPACK 排列更改为真正的排列?
- Lapack函数DGTSV通过C /Visual Studio提供未解决的外部符号
- MATLAB faster than LAPACK?
- SuperLu和LaPack的比较在与犰狳进行基准测试时失败
- 检查并行化 BLAS 例程的结果
- Blas 和 Lapack 库是否有本机 C++(不是 C)接口?
- 推广到多个BLAS/LAPACK库
- 矩阵乘法的快速LAPACK/BLAS
- 在Windows 7的Qt Creator项目中链接MLPACK, Armadillo和LAPACK/BLAS
- 与LAPACK和BLAS的链接会导致c++异常无法处理
- BLAS/LAPACK未安装:如何安装
- 在c++中调用lapack和blas
- 可变大小阵列与LAPACK/BLAS
- 将英特尔的MKL(BLAS&LAPACK)连接到GCC
- Armadillo C++和BLAS和ATLAS在mingw32下找不到lapack BLAS
- C++中的矩阵操作(使用 Blas/Lapack 或其他替代方案)