【发布时间】:2017-12-17 03:16:57
【问题描述】:
我正在尝试使用 MPI 指令并行化优化例程。程序的结构大致如文末的框图所示。数据被馈送到优化程序,它调用一个目标函数子程序和另一个子程序,计算一个称为“雅可比”的矩阵。优化例程根据需要迭代多次以达到目标函数的最小值并以结果退出。雅可比用于确定最小值可能在哪个方向,并朝该方向迈出一步。我无法控制优化例程,我只提供目标函数和计算雅可比行列式的函数。大部分时间都花在计算雅可比行列式上。由于雅可比矩阵的每个矩阵元素都独立于其余元素,因此它似乎是并行化的良好候选者。但是,我无法做到这一点。最初我在想我可以将雅可比矩阵的计算分布在大量节点上,每个节点只计算一些矩阵元素。我这样做了,但是仅在一次迭代之后,节点上的所有线程都退出并且程序停止了。我开始认为,如果没有优化例程的源代码,这可能是不可能的。原因是将代码分布在多个节点上并指示它们只计算雅可比的一小部分会破坏除主节点之外的所有节点的优化。有没有办法解决它,使用 MPI 并且不接触优化例程中的代码?只能在除主节点之外的所有节点上执行计算雅可比的函数吗?你会怎么做?
【问题讨论】:
-
您是通过象征性地获取目标函数的偏导数来计算雅可比行列式,然后根据您当前猜测的最佳输入向量对其进行评估,或者您是通过评估小目标函数来进行数值计算与您当前的猜测有偏差?
-
@lockcmpxchg8b 目标函数没有解析表达式,所以我用数值计算导数。这些计算既冗长又耗时,这就是我希望将它们并行化的原因。 MPI 看起来是个不错的选择,但我不确定它是否能在这种情况下工作,因为我无法访问优化例程的源代码。也许我得自己写 OR。
-
@High Performance Mark 谢谢你的建议。我可能会在那里发布问题,但看起来重点是算法,而不是性能。
-
如果你最终实现了自己的 OR,我发现 web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf 非常好。我根据这本书实现了具有等式和不等式约束的顺序二次规划——用于轻度非线性优化问题。
-
我认为 MPI 可以有效地计算雅可比行列式的每个元素,特别是在评估目标函数本身成本很高的情况下。 MPI 中有一些函数用于管理共享二维数组的更新,它可以用作雅可比矩阵的存储。许多 OR 允许您提供计算雅可比行列式的例程,因此您可以在不查看 OR 的其余部分的情况下挂钩它。
标签: mpi openmpi nonlinear-optimization