Blas和Lapack库是否有原生C ++(非C)接口?

时间:2017-12-14 13:51:46

标签: c++ lapack blas

目前,有:

  • cblas ,附带blas
  • lapacke ,附带lapack

然而,这些是C接口。

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

2 个答案:

答案 0 :(得分:2)

最近,这两个来自田纳西大学的界面已经发布:

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

让我们考虑一个基本的通用编程示例:

想象一下,由于cblas_?scal函数,您想要缩放矢量:v = alpha*v

使用cblas ,如果你想要一些东西&#34;泛型&#34;在某种意义上,它具有所有支持的标量类型(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 来说,它更有趣,它有几百个包装的子程序。

答案 1 :(得分:1)

这不完全是你所寻求的,但建议Blaze C++ library

  

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

     

Blaze图书馆提供......

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

Wiki包含支持BLASLAPACK功能的列表。

我自己没有使用它,但benchmarks表明,这个库表现得非常好。开发社区非常友好,可供讨论。