Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MPI.NET:运行多个连续会话_C#_.net_Mpi_Message Passing - Fatal编程技术网

C# MPI.NET:运行多个连续会话

C# MPI.NET:运行多个连续会话,c#,.net,mpi,message-passing,C#,.net,Mpi,Message Passing,我一直在玩MPI.NET,遇到了一个我似乎无法解决的问题 为运行MPI.NET的代码创建测试时,我有两个单元测试,由MSTest按顺序运行,每个单元测试创建一个通信器并对其进行处理。 进行此操作时,您最终会遇到这样一种情况:在第二次测试中,通信器被初始化并被释放(这里的原因是静态变量) 我不想从测试的角度来解决这个问题(以不同的方式运行测试不会解决问题)。 我只是向您展示这个案例,以便轻松演示问题 我希望有一个明智的方法来初始化MPI.NET两次,或者以某种方式回收它 我确实与该项目的作者取得了

我一直在玩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);
publicstaticvoidrunmpiaction(操作)
{
字符串[]args=null;
使用(var env=新环境(ref args))
{
行动(Communicator.world);
}
}
MPI.Environment.RunMPIAction(comm=>
{
运行(通信、记录器、参数);
}
RunMPIAction(comm=>{int rank=comm.rank;},false);

MPI的设计目的不是这样使用。创建新环境调用,其中说明:

此函数只能由一个线程调用。该线程将 称为“主线程”,并且必须是要调用的同一线程 MPI_最终确定

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

正在处理
环境
调用,其中说明:

MPI_Finalize函数清除与MPI相关的所有状态 则不能调用其他MPI函数,包括MPI_Init 和MPI_Init_线程

从这一点可以清楚地看出,每个进程只能有一个
环境
,一旦释放,就无法重新创建它

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

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

这是可以做到的,因为
环境
在语义上是一个单例,可能是一个静态类,但由于方便
使用
语句,所以语句被设置为非静态(只有实例成员是
Dispose
函数).

请显示您的代码。已添加到文章正文中。RunMPIAction可以从不同位置多次调用,在这种情况下,这些操作应该无关紧要。@Stevey,当前状态下的问题不清楚,因为它不完整。请阅读并提供一个可用于更好地理解您的问题的示例。