Blas 和 Lapack 库是否有本机 C++(不是 C)接口?



目前,有:

  • 与 BLAS 一起运送的CBLAS
  • 与拉帕
  • 克一起发货的拉帕克

但是,这些是 C 接口。

显然,您可以在C++代码中使用它们,但是如果这些接口是为C++设计的,则无法获得所有好处。所以我的问题是:本机C++中是否存在此类接口?

最近,田纳西大学的这两个接口已经发布:

  • https://bitbucket.org/icl/blaspp
  • https://bitbucket.org/icl/lapackpp

使用这些本机C++实现有一些直接的好处。

让我们考虑一个基本的泛型编程示例:

想象一下,你想缩放一个向量:v = alpha*v这要归功于cblas_?scal函数。

对于cblas,如果你想要一些"通用"的东西,因为它对所有支持的标量类型(floatdoublecomplex<float>complex<double>,...)具有相同的接口,则必须包装所有C函数:

void scal(cblas_int n,float alpha, float *x, cblas_int inc) {
...
cblas_sscal(n,alpha,x,inc);  <- s for float
}
void scal(cblas_int n,double alpha, double *x, cblas_int inc) {
...
cblas_dscal(n,alpha,x,inc);  <- d for double
}
// do the same for complex<float>, complex<double> ...

原因是在 C 中,如果两个函数具有不同的名称,则它们是不同的:cblas_sscalcblas_dscal...... C++你可以有相同的名称scal,这是编译器的工作,根据它的参数调度到正确的函数,这里floatdouble...

现在的情况。使用上述 https://bitbucket.org/icl/blaspp C++本机接口,此样板代码已经编写了一次。例如,如果您查看 scal.hh 头文件,您有:

void scal(int64_t n, float alpha, float *x, int64_t incx ) { ... }
void scal(int64_t n, double alpha, double *x, int64_t incx ) { ... }
void scal(int64_t n, std:complex<float> alpha, std:complex<float> *x, int64_t incx ) { ... }
void scal(int64_t n, std:complex<double> alpha, std:complex<double> *x, int64_t incx ) { ... }

甚至是通用实现:

template<typename T>
void scal(int64_t n, T alpha, T *x, int64_t incx ) { ... }

因此,使用此C++接口,可以轻松地为您喜欢的向量/矩阵类型定义通用接口。例如,使用std::vector<T>,您只需要写入(独立于实际的 T 类型):

template<typename T>
void scal(T alpha, std::vector<T>& v) {
scal(v.size(),alpha,v.data(),1);
}

没有更多的样板代码!


这是这个想法,但请注意:

  • 尚未为所有子例程实现泛型实现,例如:

.

template< typename TA, typename TX >
void trmm(
blas::Layout layout,
blas::Side side,
blas::Uplo uplo,
blas::Op trans,
blas::Diag diag,
int64_t m,
int64_t n,
typename blas::traits2<TA, TX>::scalar_t alpha,
TA const *A, int64_t lda,
TX       *B, int64_t ldb )
{
throw std::exception();  // not yet implemented
}
  • 前面的例子使用了blas,但是,对于具有数百个包装子例程的lapack来说,它更有趣。

它不完全是你想要的,但建议 Blaze C++库:

Blaze 是一个开源、高性能的C++数学库,适用于密集 和稀疏算术。凭借其最先进的智能表情 模板实现 Blaze 结合了优雅和易用性 具有 HPC 级性能的领域特定语言,使其成为一种 最直观、最快速的C++数学库。

烈焰图书馆提供...

  • 。通过集成 BLAS 库和手动调整的 HPC 数学内核实现高性能
  • 。通过 SSE、SSE2、SSE3、SSSE3、SSE4、AVX、AVX2、AVX-512、FMA 和 SVML 进行矢量化
  • 。通过 OpenMP、C++11 线程和 Boost 线程并行执行
  • 。特定领域语言的直观且易于使用的API
  • 。具有密集和稀疏向量和矩阵的统一算术
  • 。经过全面测试的矩阵和矢量算法
  • 。完全可移植,高质量C++源代码

Wiki 支持列表 BLAS 和 LAPACK 函数。

我自己没有使用它,但基准测试显示,这个库表现非常好。开发社区非常友好,可以讨论。

相关内容

  • 没有找到相关文章

最新更新