使用 MPI 进行数值优化

Numerical optimization with MPI

我正在尝试使用 MPI 指令并行化优化例程。程序结构大致如文末框图所示。数据被馈送到优化例程,它调用一个 Objective 函数子例程和另一个子例程,该子例程计算一个名为“Jacobian”的矩阵。优化例程根据需要迭代多次以达到 Objective 函数的最小值并以 result.The 退出 Jacobian 用于决定最小值可能在哪个方向并朝该方向采取步骤.我无法控制优化例程,我只提供 Objective 函数和计算雅可比行列式的函数。大部分时间花在计算雅可比行列式上。由于 Jacobian 的每个矩阵元素都独立于其余元素,因此它似乎是并行化的良好候选者。但是,我无法做到这一点。最初我想我可以将雅可比行列式的计算分布在大量节点上,每个节点只计算一些矩阵元素。我这样做了,但仅在一次迭代之后,节点上的所有线程都退出了,程序停止了。我开始认为如果没有优化例程的源代码,这可能是不可能的。原因是将代码分布在多个节点上并指示它们只计算雅可比行列式的一小部分会扰乱除主节点之外的所有节点的优化。有没有办法解决它,使用 MPI 而不触及优化例程中的代码?是否只能在除 master 之外的所有节点上执行计算 Jacobian 的函数?你会怎么做?

结果比我想象的要容易。如问题中所述,工作线程仅在一次迭代后退出。解决方案是将代码包含在由无限 while 循环的 worker 执行的 Jacobian 计算中,并在它退出时通过从主线程 (master) 发送一条消息来中断它。