2016-07-30 337 views
0

我试图重现在此post中提出的问题。以下是我的代码。根据答案,因为每个进程都是独立运行的,所以global_variable应该在进程1中为0.然而,进程1也会打印1000.所以在我的理解中,进程是在MPI_Init中产生的,所以如果全局变量是在MPI_Init之前定义的,创建的流程将获得相同的价值,对吧?我误解了这篇文章吗?MPI及其全局变量

#include <stdio.h> 
#include <mpi.h> 

static int global_variable; 

main(int argc, char **argv) 
{ 
    int ierr, num_procs, my_id; 

    global_variable = 1000; 

    ierr = MPI_Init(&argc, &argv); 

    /* find out MY process ID, and how many processes were started. */ 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    if(my_id == 0) { 
     printf("%d\n", global_variable); 
    } 
    else if(my_id == 1) { 
     printf("%d\n", global_variable); 
    } 

    ierr = MPI_Finalize(); 
} 
+0

想知道,如果你不使用它们,你为什么要存储所有'ierr'返回值? – Kusalananda

+1

@Kusalananda在评论中有一点。而且,与文件I/O无关的MPI调用的默认错误处理程序会终止整个作业,因此这些'MPI _...'例程将返回MPI_SUCCESS或根本不返回。除非'MPI_ERRORS_RETURN'错误处理程序被**明确**设置,即。 –

回答

1

这就是独立的手段:

#include <stdio.h> 
#include <mpi.h> 

static int global_variable; 

int main(int argc, char **argv) 
{ 
    int ierr, num_procs, my_id; 
    ierr = MPI_Init(&argc, &argv); 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    if (my_id == 0) { 
     global_variable = 1000; 
    } 
    MPI_Barrier(MPI_COMM_WORLD); 
    printf("%d\n", global_variable); 

    ierr = MPI_Finalize(); 
} 

在这里,只处理0变为global_variable。在你的例子中,global_variable = 1000;行不是特定于任何一个进程,所有进程都会执行它。

+0

感谢您的回复。我之前有过误会。我认为新创建的进程将在MPI_Init之后执行该程序。但是,根据你的回答,“所有进程将执行global_variable = 1000”,这意味着每个进程从main()的开头运行程序,对吗?非常感谢。 – HuangJie

+2

@黄杰,几乎所有的生产级MPI实现对每个MPI等级使用不同的OS进程,这意味着等级从ma​​in()开始执行程序代码。尽管如此,MPI标准并没有规定这种行为,并且使用线程的实现取而代之的是存在共享全局变量等所有后果。 –