【发布时间】:2026-01-27 14:05:01
【问题描述】:
我有一个算法,它需要在一个函数内构建一个 NxN 矩阵,该函数将返回这个矩阵与一个 Nx1 向量的乘积,该向量也是动态构建的。 (N 通常为 8 或 9,但必须对大于该值的值进行泛化)。
我正在使用 Eigen 库来执行更复杂的代数运算(最小二乘和其他几个约束问题),因此不能切换它。
我已经对函数进行了基准测试,但由于内存密集,存在巨大的瓶颈 分配。我的目标是构建一个线程安全的应用程序,因此,在某些情况下,我将这些矩阵和向量替换为对全局向量中元素的引用,该向量用作无法存储在堆栈上的对象的提供者。这避免了调用 Eigen 矩阵和向量的构造函数/析构函数,但它不是一个优雅的解决方案,如果不小心,它可能会导致巨大的问题。
因此,Eigen 是否提供了一种解决方法,因为我没有看到将分配器作为模板参数传递给这些对象的选项,或者是否有更明显的事情要做?
【问题讨论】:
-
N在通话之间是否发生变化?如果是,那么当你不知道N会是什么时,你是如何准备这个“全局对象”的? -
N 在调用之间不会改变。它取决于创建正在处理的对象的输入数据模型。
-
那么也许你可以在你的函数中让你的“资源管理器”成为
static。否则,全球性的很难避免 IMO。我认为这应该不是很难。你应该做一些简单的事情,即没有垃圾收集或任何清理。 -
由于多线程限制,最好在线程基础上为这些矩阵提供一个外部/全局提供程序。
-
您可以在资源管理器中拥有锁。是否为
static无关紧要。当然,如果您的应用程序分配垃圾邮件,它将在这些调用中被序列化。但它不认为这在正常用例中是一个真正的问题。另外我不认为eigen暴露了它的内存分配。为了使用 SSE,他们做了一些魔术来获得内存对齐。所以最好的办法是像你一样将eigen对象本身包装在某种资源管理器中。
标签: c++ performance memory-management matrix eigen