为什么 C# MPI.NET 不能从排名为 1 的进程中 Console.ReadLine?

Why C# MPI.NET cannot Console.ReadLine from process with rank 1?

我有一个简单的 MPI C# 程序,我希望其中的等级为 1 的进程要求用户输入一些信息。但是,这不起作用。

我想知道为什么这不起作用?只有一个进程可以访问控制台是有道理的,因为它是一种共享资源,但是有什么办法可以解决这个问题吗?

MPI 标准很少提及标准 I/O(这是有意为之,目的是为了不将标准的适用性限制在没有 I/O 功能的奇特架构上),这是不同之处实现可能而且有时确实会有所不同。根据经验,所有等级的标准输出都由启动程序重定向和显示(如果有的话,例如 mpiexecmpirunaprun 等)但只处理等级0 可以访问标准输入。这就是为什么许多 MPI 程序包含类似于以下代码的原因:

if (rank == 0) {
   // Read data from standard input
}
MPI_Bcast(&data, some_size, some_type, 0, MPI_COMM_WORLD);

以上是在 C(++) 中,但这个概念也适用于 C#。有权访问标准输入的等级(在这种情况下等级 0)读取用户输入,然后参与读取数据的广播。

这仍然不是完全可移植的。 MPI 不要求等级 0 可以访问 I/O - 它只是有多少流行的 MPI 实现功能。便携式应用程序应查询 MPI_COMM_WORLD 以获得 MPI_IO 属性,从而确定是否可以使用标准 I/O 工具。即使可用,标准输入也不能是集体的,并且仅将其连接到等级 0 是大多数供应商认为最合适的(但以 Open MPI 为例,可以在 运行 时间指定哪个等级接收标准输入)。

鉴于 MPI 主要用于 运行 批处理模式下没有控制台的应用程序,最好使用文件来提供输入数据。