我正在考虑实现类似容器的数组,并且不确定使用gsl::gsl_vector还是std::vector。容器需要空间高效,但调用值时也要非常快。容器将在主程序中不断引用,例如,将值输入到张量函数中。我实际上是从容器中打电话数十亿次。

到目前为止,我已经考虑了以下优点和缺点:
gsl_vector很方便,因为它允许我偶尔使用gsl BLAS库,并且gsl_vector_get(...)调用非常有效。另一方面,我可以使用STL迭代器获得几乎相同的调用速度,并且STL vector 具有我觉得很自然的接口(interface)。

我应该注意上面的代码中忽略的内存开销/效率问题吗?

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

最佳答案

一方面,确实可以通过gsl_vector使用gsl BLAS,这是一个很大的优势。另一方面,对于C++程序员来说,gsl接口(interface)确实很麻烦。因此,两种解决方案都不是真正令人满意的。但是,我强烈建议使用gsl_matrix,因为

(i)尽力而为,您可以编写一个小的包装器类来改善gsl_matrix繁琐的C接口(interface)(很难解决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

为什么大火?

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

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

benchmark

关于c++ - gsl::gsl_vector与std::vector的开销和效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17805247/

10-13 09:10