MPI初始化中的查询

MPI初始化中的查询,mpi,openmpi,Mpi,Openmpi,如果调用MPI_Init(),我们知道同一个可执行文件的多个副本在不同的机器上运行。假设MPI_Init()位于函数f()中,那么main()函数是否也存在多个副本 我面临的主要问题是接受输入。实际上,所发生的情况是,输入被获取一次,但主函数运行了几次秩为0的处理器似乎总是有输入,其余处理器都有随机值。所以要发送值,我们必须将输入从处理器0广播到所有其他处理器吗?MPI_Init()不会创建多个副本,它只是初始化进程内MPI库。在此之前会创建多个进程副本,最有可能是使用某种mpirun命令(这就

如果调用MPI_Init(),我们知道同一个可执行文件的多个副本在不同的机器上运行。假设MPI_Init()位于函数f()中,那么main()函数是否也存在多个副本

我面临的主要问题是接受输入。实际上,所发生的情况是,输入被获取一次,但主函数运行了几次秩为0的处理器似乎总是有输入,其余处理器都有随机值。所以要发送值,我们必须将输入从处理器0广播到所有其他处理器吗?

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

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

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


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

您应该只执行一次MPI_Init()(也就是说,在源代码中可能只执行一次)。程序的参数在所有处理器上都应该是可读的。您应该只执行一次MPI_Init()(也就是说,在源代码中可能只执行一次)。程序的参数应该在所有处理器上都可读。谢谢。)我还有一个疑问。假设我有一个函数doSomething(int*a),其中doSomething()由其他应用程序调用,我的MPI代码位于该函数中,那么即使如此,我们是否需要提供广播机制?如果我没有弄错,“其他应用程序”是代码的一部分,即它与您的程序链接。然后,在启动MPI程序后,您有N个单独的进程(可能在不同的机器上运行),每个进程都包含该“应用程序”的副本,您将有N个对doSomething的调用—每个调用在其机器上都有其本地A。想象一下,您编译了程序并在10台计算机上手动启动了它—进程是相互隔离的,彼此不了解(除非它们调用MPI库),这正是mpirun之后发生的事情。MPI不是多线程。在多线程中,您可以初始化一些共享变量,然后使用它们生成线程(也许您希望在程序中也这样做);这需要共享内存,因此仅限于一台机器。MPI没有共享内存模型,因此编程进程间通信变得更加困难,但MPI应用程序可以在多台机器上运行,这是一个巨大的优势。谢谢。我现在明白了。谢谢我还有一个疑问。假设我有一个函数doSomething(int*a),其中doSomething()由其他应用程序调用,我的MPI代码位于该函数中,那么即使如此,我们是否需要提供广播机制?如果我没有弄错,“其他应用程序”是代码的一部分,即它与您的程序链接。然后,在启动MPI程序后,您有N个单独的进程(可能在不同的机器上运行),每个进程都包含该“应用程序”的副本,您将有N个对doSomething的调用—每个调用在其机器上都有其本地A。想象一下,您编译了程序并在10台计算机上手动启动了它—进程是相互隔离的,彼此不了解(除非它们调用MPI库),这正是mpirun之后发生的事情。MPI不是多线程。在多线程中,您可以初始化一些共享变量,然后使用它们生成线程(也许您希望在程序中也这样做);这需要共享内存,因此仅限于一台机器。MPI没有共享内存模型,因此编程进程间通信变得更加困难,但MPI应用程序可以在多台机器上运行,这是一个巨大的优势。谢谢。我现在明白了。