我正在考虑实现一个类似容器的数组,但我不确定是使用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来获得正确的向量,而不是迭代器。这会不会更有效率?
发布于 2013-08-24 02:30:18
一方面,使用gsl_vector确实可以使用gsl BLAS,这是一个很大的优势。另一方面,gsl接口对于c++程序员来说也是相当繁琐的。因此,这两种解决方案都不是真正令人满意的。但是,我强烈倾向于使用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库中的StaticMatrix或DynamicMatrix类实现张量计算。
为什么是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运算)是可怕的,因为编译器不能比低级代码更智能。然而,“表达式模板”可以作为像英特尔MKL这样的低级BLAS库的更智能的包装器。因此他们创建了“智能表达式模板”技术,它只是对您选择的低级blas库的包装。他们的基准是惊人的。
https://stackoverflow.com/questions/17805247
复制相似问题