gpt4 book ai didi

c++ - gsl::gsl_vector vs std::vector 开销和效率

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:43 29 4
gpt4 key购买 nike

我正在考虑实现一个类似于容器的数组,但我不确定是使用 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 库中的 StaticMatrix 或 DynamicMatrix 类来实现张量计算

Blaze

为什么选择 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 运算)来说非常糟糕,因为编译器不能比低级代码更聪明。但是,“表达式模板”可以用作低级 BLAS 库(如英特尔 MKL)的智能包装器。因此,他们创建了“智能表达式模板”技术,它只是您选择的低级 blas 库的包装器。他们的基准令人震惊

benchmark

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com