我有一个简单的MPI C#程序,我希望有一个排名为1的进程向用户询问一些输入。但是,这不起作用。
我想知道为什么这不起作用?有意义的是,只有一个进程应该可以访问控制台,因为它是一个共享资源,但有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
MPI标准对标准I / O几乎没有提及(这是故意的,所以不限制标准对没有I / O功能的花式架构的适用性),这是不同实现可能有时会有所不同的点。根据经验,所有等级的标准输出都会被启动器重定向并显示(如果有的话,例如mpiexec
,mpirun
,aprun
等等,但只能按等级进行处理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,可以在运行时指定哪个等级接收标准输入)。 / p>
鉴于MPI主要用于在批处理模式下无控制台运行的应用程序,最好使用文件提供输入数据。