MPI调用函数和函数参数

时间:2013-08-20 18:55:05

标签: c arguments mpi

我有一个我想在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

这是否意味着每个流程都有自己的变量副本 a i ,以及MPI如何在我拥有后继续运行在MPI_Finalize()内调用function()

1 个答案:

答案 0 :(得分:4)

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

MPI_Init()MPI_Finalize() 标记并行处理的开始和结束。它们标记允许其他MPI调用的开始和结束。 MPI运行整个程序的多个独立实例,每个实例都有自己独立的内存空间。是的,每个流程都有自己的ai

副本