- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在考虑实现一个类似于容器的数组,但我不确定是使用 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?
(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 库的包装器。他们的基准令人震惊
关于c++ - gsl::gsl_vector vs std::vector 开销和效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805247/
我正在编写一些代码,其中使用了一些 GNU GSL 函数。 出于纯粹的兴趣,我想知道这些功能是如何实现的,因此我想看看源代码。 问题是我似乎无法找到它所在的目录。 我知道我可以在“/usr/local
我需要计算 ∫ [x₁ to x₂] 1/√(1-k² sinh²(x)) dx 在我的程序中。这可以使用在复数参数中评估的第一类不完全椭圆积分来表示: -i (F(ix₂ | -k²) - F(ix
brew install gsl - 没问题 快速制作一个使用 gsl 的 Mac 应用程序,以检查它是否正常工作。 ( Handy example here. ) - 没问题 它们在/include
给定以下函数,采用:只读 float 跨度(动态或任何静态大小): template void foobar(gsl::span x); 假设我有一个 vector .将其作为参数传递是行不通的,但
C++ Core Guidelines促进实践using span . 问题在于 const 和可变范围。这是我尝试做的: auto foo(gsl::span); // 1st au
我正在尝试获取一个名为 emergent 的软件在职的。它依赖于我已经安装的 qt 和 coin。 但是当我尝试运行 emergent 时,出现以下错误: dyld: Library not load
假设我有一个成员变量std::vector在一个类中,我想使用 gsl::array_view 的组合从成员函数返回它作为不可变 View 和 gsl::cstring_view .不幸的是,以下内容
我正在尝试计算两个 vector a 和 b 之间的马氏距离。最终,我将使用它作为统计算法中的距离度量。我正在使用 gsl 来实现它们。马氏距离的公式是 sqrt((a-b)'c^-1(a-b)),其
我正在将指南支持库检查器集成到我的项目中。 Microsoft.CppCoreCheck Microsoft.Gsl 当我运行它时,我从包含的库(如标准库、glm、boost 等)中收到一堆错误。 一
我记得读过 mat4x3 比 mat3x4 使用了更多的寄存器,因为它有四列,即使它们具有相同数量的元素。我似乎无法在任何地方找到它了。新规范是否对两种类型的矩阵使用相同数量的统一寄存器? 转置是否也
我想使用 GSL 的统一随机数生成器。在他们的网站上,他们包含以下示例代码: #include #include int main (void) { const gsl_rng_t
我最近安装了 GSL,用于我的计算作业。我从预构建的库安装了它,并将其链接到 CodeBlocks,然后运行 GSL(贝塞尔函数)的测试示例以确保它有效。一切都很顺利。 然后我尝试了这里给出的线性
我现在正在与 GSL 合作。我在寻找特征值时遇到一些问题。在对称矩阵的情况下,GSL 似乎没有正确给出特征值。我给出了某些对称矩阵的输入,这些矩阵的特征值应该为 0,但是,GSL 函数返回非零特征值来
构建后: $ gcc generator.c -lm -lgsl -lgslcblas -lm 代码: #include #include gsl_rng * r; /* global gene
我正在使用 GSL 进行大量三次样条插值。假设我有三个自变量 a、b 和 c,所有变量都在相同的物理数据点上制表(可能是同一组位置)以米、英尺和英里为单位),以及两个因变量 y 和 z,在相同点处制表
我目前正在尝试在另一个自己编写的库(Quaternion.c)中使用我之前编写的库(matrix.c),方法是使用使用“matrix.h”的标准方法通过头文件调用它”包含“matrix.c”文件中的函
我正在尝试更新旧代码,该代码使用的是具有已弃用函数的 GSL 版本,但我在寻找如何使用新版本的归一化勒让德多项式函数时遇到了麻烦。这是总结问题的片段: #include #include #inc
我正在使用 GSL 示例页面上的代码来尝试求解一个包含四个微分方程的系统。我一直在努力将五个参数传递给 ODE 系统,并且遇到了一个最终的(我希望!)编译时错误。下面是一个片段,给我错误 114:57
我已经在 Kubuntu 14.04 中安装了最新版本的 GSL (1.16)。我使用库附带的文件 INSTALL(逐步)进行安装。我配置了 eclipse-cdt 环境以供使用。它工作,我认为,因为
我有一个非常简单的问题——我只想在 C 语言的 gsl 中将两个具有复杂条目的矩阵相乘。例如,我想定义一个函数 gsl_matrix_complex *multiply( gsl_matrix_com
我是一名优秀的程序员,十分优秀!