推广到多个BLAS/LAPACK库

Generalizing to multiple BLAS/LAPACK Libraries

本文关键字:LAPACK BLAS      更新时间:2023-10-16

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

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

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

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

您已经说过,函数原型在不同的实现中是相同的。这允许您只在一些myblas.hmylapack.h标头中拥有原型,然后链接您想要使用的任何库。

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

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

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