目前,有:
然而,这些是C接口。
显然,您可以在C ++代码中使用它们,但如果这些接口是为C ++设计的,那么您将无法获得所有好处。所以我的问题是: 本机C ++中是否存在此类接口?
答案 0 :(得分:2)
最近,这两个来自田纳西大学的界面已经发布:
使用这些本机C ++实现有一些直接的好处。
让我们考虑一个基本的通用编程示例:
想象一下,由于cblas_?scal函数,您想要缩放矢量:v = alpha*v
。
使用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
}
答案 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 ++源代码
我自己没有使用它,但benchmarks表明,这个库表现得非常好。开发社区非常友好,可供讨论。