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

标签 c++ vector stl comparison gsl

我正在考虑实现一个类似容器的数组,并且我不确定是否使用 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 运算)来说非常糟糕,因为编译器不可能比低级代码更智能。然而,“表达式模板”可以用作低级 BLAS 库(如英特尔 MKL)的更智能包装。因此,他们创建了“智能表达式模板”技术,它只是您选择的低级 blas 库的包装器。他们的基准令人惊讶

benchmark

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

相关文章:

c++ - 读\写 boost::binary_oarchive 到管道

c++ - 数据类型与 arduino 和 coder.ceval 不匹配

c++ - Mingw libgcc_s_sjlj-1.dll 丢失

c++ - Floyd 算法使用 (const vector<int>& t : flights), 存储在 't' 上的值是什么

c++ - 如何专门化 vector 类模板?

C++: vector "corrupting"的第一个元素

c++ - 防止 bool 中的隐式对象构造?

c++ - 从存储在 std::vector 中的数据创建和保存图片

c++ - `iterators` 和 `references to elements` 之间的区别

c++ - 使用 STL 算法重写的指针的循环示例,没有循环?