2014-02-23 55 views
0

如果我们调用MPI_INIT()我们知道,在不同的机器一样运行可执行文件的多个副本。假设MPI_Init()在函数f()中,那么main()函数的多个副本是否也存在?查询在MPI初始化

,我现在面临的主要问题是服用投入实际上,发生的情况是输入正在进行一次,但主要功能正在运行几次等级0的处理器似乎总是有输入,其余的都有随机值。所以要发送这些值,我们必须将来自处理器0的输入广播到所有其他处理器?

+0

你应该执行MPI_INIT()只有一次(即,在源代码中可能正好出现一次)。您的程序的参数应该在所有处理器上都可读。 – stefan

回答

4

MPI_INIT()不创建多个副本,它只是初始化进程MPI库。你的程序的多个副本创建在此之前,最有可能以某种mpirun命令(那你是怎么运行的MPI应用程序)。所有进程都从一开始就是独立的,因此回答第一部分的问题 - 是的,main()将存在多个副本,即使您不调用MPI_Init,它们也会存在。

回答你关于投入问题取决于输入性质:如果它是从控制台输入了,那么你要输入的值只在一个进程(例如等级0),然后进行广播。如果输入在某个文件中或被指定为命令行参数,则所有进程都可以访问它们。

+0

谢谢。 :) 我还有一个疑问。假设我有一个函数doSomething(int * A),其中doSomething()被某个其他应用程序调用,并且我的MPI代码位于此函数内,那么即便我们需要提供广播机制? –

+0

如果我理解正确,'其他应用程序'是代码的一部分,即它与您的程序相关联。然后,在启动MPI程序后,您将有N个单独的进程(可能运行在不同的计算机上),每个进程都包含该“应用程序”的副本,并且您将有N次调用doSomething - 每台机器上都有其本地答案。 想象一下,你编译你的程序并手动在10台计算机上启动 - 进程是孤立的,彼此不知道(除非他们调用MPI库),这正是mpirun之后发生的情况。 – Inspired

+0

MPI不是多线程的。在多线程中,你可以初始化一些共享变量,然后用它们产生线程(也许你想在你的程序中做同样的事情);这需要共享内存,因此仅限于一台机器。 MPI没有共享内存模型,所以编程进程间通信变得更加困难,但MPI应用程序可以在多台机器上运行,这是一个巨大的优势。 – Inspired