【问题标题】:MPI and its global variableMPI 及其全局变量
【发布时间】:2016-07-30 05:53:31
【问题描述】:

我试图重现此post 中提出的问题。下面是我的代码。根据答案,由于每个进程独立运行,所以进程1中的global_variable应该为0。但是,进程1也打印1000。所以在我的理解中,进程是在MPI_Init中产生的,所以如果之前定义了全局变量MPI_Init,创建的进程会得到相同的值,对吧?我误解了那个帖子吗?

#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();
}

【问题讨论】:

  • 只是想知道,如果您不使用它们,为什么要存储所有这些 ierr 返回值?
  • @Kusalananda 的评论中有一点。此外,与文件 I/O 无关的 MPI 调用的默认错误处理程序会终止整个作业,因此那些 MPI_... 例程将返回 MPI_SUCCESS 或根本不返回。除非MPI_ERRORS_RETURN 错误处理程序已明确设置,否则。

标签: c mpi


【解决方案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; 行并不特定于任何一个进程,所有进程都会执行它。

【讨论】:

  • 感谢您的回复。我之前有误会。我认为新创建的进程将在 MPI_Init 之后立即执行程序。但是,根据您的回答,“所有进程都将执行 global_variable = 1000”,这意味着每个进程都从 main() 开始运行程序,对吗?非常感谢。
  • @HuangJie,几乎所有生产级 MPI 实现都为每个 MPI rank 使用单独的 OS 进程,这意味着这些 rank 从main() 开始执行整个程序代码。尽管如此,MPI 标准并没有强制要求这种行为,而是使用线程的实现会产生诸如共享全局变量之类的所有后果。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多