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