【问题标题】:MPI.NET: run multiple sequential sessionsMPI.NET:运行多个顺序会话
【发布时间】:2017-10-26 10:00:38
【问题描述】:

我一直在使用 MPI.NET,但遇到了一个我似乎无法解决的问题。

在为运行 MPI.NET 的代码创建测试时,我有两个由 MSTest 按顺序运行的单元测试,每个测试都创建一个通信器并处理它。
这样做时,您最终会遇到通信器在第二次测试中被初始化和处置的情况(这里的原因是静态变量)。

我不想从测试的角度来解决这个问题(以不同的方式运行测试不会解决问题)。 我只是向您展示该案例,以便轻松证明问题。

我希望有一种明智的方法来两次初始化 MPI.NET,或者以某种方式回收它?

我确实与该项目的作者取得了联系,他建议我在这里发帖,让更熟悉 MPI 本身的人可以提供帮助。

public static void RunMPIAction(Action<Intracommunicator> action)
{
    string[] args = null;
    using (var env = new Environment(ref args))
    {
        action(Communicator.world);
    }
}

MPI.Environment.RunMPIAction(comm =>
{
    this.Run(comm, logger, parameters);
}

MPI.Environment.RunMPIAction(comm => { int rank = comm.Rank; }, false);

【问题讨论】:

  • 请出示您的代码。
  • 添加到帖子正文中。 RunMPIAction 可以从不同的地方多次调用,在这种情况下,操作应该无关紧要。
  • @Stevey,当前状态的问题尚不清楚,因为它不完整。阅读How to Ask,然后提供minimal reproducible example,可以用来更好地理解您的问题。

标签: c# .net mpi message-passing


【解决方案1】:

MPI 不是为这样使用而设计的。创建新环境调用MPI_Init_thread,其中指出:

该函数只能由一个线程调用。该线程将是 称为“主线程”,必须是同一线程才能调用 MPI_Finalize。

尝试从多个线程或从一个线程多次调用它会失败。

处理Environment 调用MPI_Finalize,其中声明:

MPI_Finalize 函数清除所有与 MPI 相关的状态。一旦它 被调用,不能调用其他 MPI 函数,包括 MPI_Init 和 MPI_Init_thread。

从中应该很清楚,每个进程只能有一个Environment,并且一旦处理就无法重新创建它。

因此,您必须重构代码以考虑到这一点。如果您有某种可重用的库 - 不要在那里初始化 MPI(只需检查它是否已经初始化,如果没有则抛出)并且不要在那里完成它 - 只有该库的“顶级”用户应该这样做。如果您没有引用已创建的 Environment 实例但您需要完成环境,则可以这样做:

if (!MPI.Environment.Finalized)
    Unsafe.MPI_Finalize();

这没关系,因为Environment 在语义上是一个单例并且可能是一个静态类,但是因为方便using 语句被设为非静态(只有实例成员是Dispose 函数)。

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2014-11-15
    • 2016-03-24
    相关资源
    最近更新 更多