C++ gsl::gsl_向量与std::向量开销和效率

C++ gsl::gsl_向量与std::向量开销和效率,c++,vector,stl,comparison,gsl,C++,Vector,Stl,Comparison,Gsl,我正在考虑实现一个类似数组的容器,我不确定是使用gsl::gsl_向量还是使用std::向量。容器需要节省空间,但调用值的速度也非常快。该容器将在主程序中不断被引用,例如,将值输入到张量函数中,等等。我在集装箱里打了数十亿次电话 以下是我到目前为止考虑过的优点和缺点: gsl_vector非常方便,因为它允许我偶尔使用gsl BLAS库,gsl_vector_get(…)调用非常有效。另一方面,我可以使用stl迭代器获得几乎相同的调用速度,而且stl向量有一个我觉得非常自然的接口 在上面的代码中

我正在考虑实现一个类似数组的容器,我不确定是使用gsl::gsl_向量还是使用std::向量。容器需要节省空间,但调用值的速度也非常快。该容器将在主程序中不断被引用,例如,将值输入到张量函数中,等等。我在集装箱里打了数十亿次电话

以下是我到目前为止考虑过的优点和缺点: gsl_vector非常方便,因为它允许我偶尔使用gsl BLAS库,
gsl_vector_get(…)
调用非常有效。另一方面,我可以使用stl迭代器获得几乎相同的调用速度,而且stl向量有一个我觉得非常自然的接口

在上面的代码中是否有我应该注意的内存开销/效率问题


此外,我目前正在使用一个
std::vector
实现,以及一个迭代器来遍历std::vector。在这里使用gsl_矩阵会更聪明吗?其思想是使用gsl_vector_视图来获得正确的向量,而不是迭代器。这会更有效吗?

一方面,使用gsl_向量确实可以使用gsl BLAS,这是一个很大的优势。另一方面,GSL接口对于C++程序员来说也是相当麻烦的。因此,这两种解决方案都不是真正令人满意的。然而,我非常喜欢使用gsl_矩阵,因为

(i) 通过一些努力,您可以编写一个小的包装器类来改进gsl_矩阵繁琐的C接口(要解决std::vector中缺少BLAS库的问题要困难得多)

(ii)gsl_矩阵只是一维连续数组的包装,其中
m(i,j)=array[i*N+j]
用于平方矩阵(即使矩阵不是平方的,gsl_矩阵仍将其实现为一维数组)。在
std::vector
中,您需要单独“malloc”每个gsl_向量,这意味着内存将不连续。这会影响性能,因为内存分配中缺少“空间局部性”通常会大幅增加缓存未命中率

如果您可以选择使用完全不同的解决方案,我将使用Blaze库中的StaticMatrix或DynamicMatrix类实现张量计算

为什么会着火

(i) StaticMatrix或DynamicMatrix接口比
std::vector
或gsl_矩阵好得多

(ii)火焰是C++中最快的BLAS库。如果您有可用的“英特尔MKL”,它比gsl快(请记住,“英特尔MKL”比gsl BLAS快)。为什么会这样?因为Blaze使用了一种叫做“智能表达式模板”的新技术。基本上,德国的研究人员在一系列文章中显示了“表达式模板”技术,这是许多C++ BLAS库中的标准技术,对于矩阵运算(BLAS 3操作)来说是可怕的,因为编译器不能比低级代码更聪明。但是,“表达式模板”可以用作英特尔MKL等低级BLAS库的更智能的包装器。因此,他们创建了“智能表达式模板”技术,它只是您选择的低级blas库的包装。他们的基准令人震惊


有趣的是,ProjectX的基准测试结果是如何显示的,碰巧X的测试速度最快。Eigen的人也非常坚持他们的代码是好的,Armadillo自从在基准测试中使用的版本以来已经改变/改进了。你的里程可能会有所不同。它比犰狳快得多(你可以看到基准链接),因为正如我所说的blaze使用“智能表达式模板”。意思:Blaze仅将模板用作低级c代码blas库(如intel mkl)的包装器。Armadillo试图在编译时使用循环展开来计算矩阵运算(“表达式模板”的原始形式),我链接的论文表明,这远远不是最佳解决方案(仅使用编译器是无法打败英特尔mkl的!)。我认为Eigen使用了混合实现,但是Blaze也比Eigen快。是的。基准可能会有所不同。但“表达式模板”无法击败英特尔MKL(或任何其他c低级代码)的想法非常可靠。使用模板作为优化低级代码的包装比依靠编译器完成100%的工作要好得多。我认为所有的C++ BLAS都是在这一点上收敛的,这是“智能表达式模板”背后的想法。MKL恰好是多核的,但它不再是唯一的多核BLAS库。犰狳也会呼叫BLAS,因此可以使用MKL或OpenBLAS或其他您安装的工具。艾根通常会尝试自己的东西,而不是叫布拉斯。但是谢谢你给我的指向Blaze的指针,我会注意的。