目前,有:
- 与 BLAS 一起运送的CBLAS, 与拉帕
- 克一起发货的拉帕克,
但是,这些是 C 接口。
显然,您可以在C++代码中使用它们,但是如果这些接口是为C++设计的,则无法获得所有好处。所以我的问题是:本机C++中是否存在此类接口?
最近,田纳西大学的这两个接口已经发布:
- https://bitbucket.org/icl/blaspp
- https://bitbucket.org/icl/lapackpp
使用这些本机C++实现有一些直接的好处。
让我们考虑一个基本的泛型编程示例:
想象一下,你想缩放一个向量:v = alpha*v
这要归功于cblas_?scal函数。
对于cblas,如果你想要一些"通用"的东西,因为它对所有支持的标量类型(float
,double
,complex<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_sscal
、cblas_dscal
...... C++你可以有相同的名称scal,这是编译器的工作,根据它的参数调度到正确的函数,这里float
,double
...
现在的情况。使用上述 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 函数。
我自己没有使用它,但基准测试显示,这个库表现非常好。开发社区非常友好,可以讨论。