【问题标题】:Why Eigen limits size on the stack?为什么 Eigen 限制堆栈的大小?
【发布时间】:2022-07-21 15:02:27
【问题描述】:

我最近发现 Eigen 使用 EIGEN_STACK_ALLOCATION_LIMIT 限制静态矩阵的大小(到 128kB)。

这个限制的原因是什么?

  • 相关:stackoverflow.com/q/13636684/4117728。堆栈是有限的,这不是特征错误,虽然 128kB 相当少
  • 如果您想在堆栈上有更大的矩阵,您可以在包含 Eigen 之前预定义该宏(最好使用命令行参数)。请注意,这是每个矩阵的限制,即,如果您同时有许多大矩阵,您仍然可能超出堆栈容量。

标签: c++ eigen


【解决方案1】:

想到几个原因:

  1. Eigen 常用于多线程代码中。主线程以外的线程通常具有固定的堆栈大小。 2-8 MiB 是常见的限制。除此之外,一些 Eigen、BLAS 和 LAPACK 例程在内部使用 alloca。在应用程序因如此大的矩阵崩溃之前,所有这些结合起来并没有留下太多空间

  2. 好处很少。分配成本将与您在这样的规模下进行的任何操作相形见绌。

  3. 存在潜在的隐性成本。就像std::array,恒定时间移动构造/移动分配是不可能的。考虑这个简单的例子:

    using Matrix = Eigen::Matrix<double, 128, 128>;
    Matrix fill();
    
    void foo()
    {
        Matrix x;
        x = fill();
    }
    

    您可能认为您直接分配给x,并且由于复制省略,没有额外费用。但实际上,编译器会分配一个临时矩阵的堆栈空间。然后fill() 将其结果存储在那里。然后将该结果复制到x。复制省略在这种情况下不起作用,因为返回值需要没有别名。

    使用动态矩阵,我们只需交换一些指针并完成它。

【讨论】:

  • 用例是尝试使用 autodiff 库计算一些导数。由于 Scalar 类型必须携带所有导数才能使 autodiff 工作,因此一个简单的 6x6 矩阵由于 Scalar 类型的大尺寸而达到了极限。
  • @jjcasmar 并没有真正改变您正在处理不适合堆栈分配的大量数据的事实。
猜你喜欢
  • 2011-10-02
  • 2012-05-16
  • 2015-06-30
  • 2020-10-02
  • 2012-11-19
  • 1970-01-01
  • 2023-04-10
  • 2018-02-08
  • 2018-10-16
相关资源
最近更新 更多