一方面,使用 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 的包装器。
基准