gsl :: gsl_vector vs std :: vector开销和效率

时间:2013-07-23 08:37:07

标签: c++ vector stl comparison gsl

我正在考虑实现一个像容器一样的数组,我不确定是使用gsl :: gsl_vector还是std :: vector。容器需要节省空间,但在调用值时也非常快。容器将在主程序中不断引用,以便例如将值输入张量函数等。我数十亿次从容器中打电话。

以下是我迄今为止考虑的优点和缺点: gsl_vector很方便,因为它允许我偶尔使用gsl BLAS库,gsl_vector_get(...)调用非常有效。另一方面,我能够使用stl迭代器获得几乎相同的调用速度,并且stl向量具有我觉得很自然的接口。

我是否应该注意到上述代码中忽略的任何内存开销/效率问题?

此外,我目前正在使用std::vector<gsl_vector*>实现,并且遍历std :: vector的迭代器。在这里使用gsl_matrix会更聪明吗?我们的想法是使用gsl_vector_views来获取正确的向量,而不是迭代器。这会更有效吗?

1 个答案:

答案 0 :(得分:2)

一方面,使用gsl_vector确实可以使用gsl BLAS,这是一个很大的优势。另一方面,对于c ++程序员来说,gsl接口也很麻烦。所以,这两种方案都不是真正令人满但是,我非常喜欢使用gsl_matrix,因为

(i)通过一些努力,您可以编写一个小包装类来改善gsl_matrix的繁琐C接口(在std :: vector中处理缺少BLAS库要困难得多)。

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

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

Blaze

为什么选择Blaze?

(i)StaticMatrix或DynamicMatrix接口比std::vector<gsl_vector*>或gsl_matrix

好得多

(ii)Blaze是C ++中最快的BLAS库。如果您有可用的英特尔MKL,那么它比gsl更快(请记住,英特尔MKL比gsl BLAS更快)。为什么这样?因为Blaze使用了一种名为“智能表达模板”的新技术。基本上,德国的研究人员在一系列文章paper 1 paper 2中表明,“表达模板”技术是许多C ++ BLAS库中的标准技术,对于矩阵操作非常糟糕(BLAS 3操作)因为编译器不能比低级代码更智能。但是,“表达模板”可以用作低级BLAS库(如intel MKL)的智能包装器。因此,他们创建了“智能表达模板”技术,它只是您选择低级别blas lib的包装器。他们的基准是令人惊讶的

benchmark