1

我有一个想用 MPI 编写的模拟,我已经开始在网上阅读它。在我的模拟中,我有一个函数,我将参数作为指向粒子数组的指针传递给它,因为我需要在模拟期间对其进行修改。现在,我不完全了解 MPI 的工作原理,所以我编写了这个小程序。

#include <stdio.h>
#include "mpi.h"
void function(int* a)
{
    int size, rank;
    MPI_Init(NULL,NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if(rank!=0)
    {
        printf("%d ", *a);
        printf("process: %d", rank);
    }
    else
    {
        (*a)++;
        printf("%d ", *a);
        printf("process: %d", rank);
    }
    printf("\n");
    MPI_Finalize();
}

int main (void) {
    int a,i;
    i=0;
    a=5;
    function(&a);
    printf("%d %d\n",a,(i++));
    printf("%d\n", i);
    return 0;
}

当我运行它时:mpirun -np 2 ./program我得到如下输出:

6 process: 0
5 process: 1
5 0
6 0
1
1

这是否意味着每个进程都有自己的变量副本ai,以及在我调用MPI_Finalize()内部之后 MPI 是否仍在运行function()

4

1 回答 1

5

这似乎是 MPI 初学者相当普遍的误解。

MPI_Init()并且MPI_Finalize()不要标记并行处理开始和结束。它们标记允许其他 MPI 调用的开始和结束。MPI 运行整个程序的多个独立实例,每个实例都有自己独立的内存空间。所以是的,每个进程都有自己的aand副本i

于 2013-08-20T20:59:07.547 回答