2

我正在考虑实现一个类似容器的数组,但我不确定是使用 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 来获得正确的向量,而不是迭代器。这会更有效率吗?

4

1 回答 1

2

一方面,使用 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 lib 中的 StaticMatrix 或 DynamicMatrix 类来实现张量计算

火焰

为什么是火焰?

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

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

基准

于 2013-08-23T18:30:18.427 回答