我有一个我想在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()
。
答案 0 :(得分:4)
这似乎是MPI初学者中相当普遍的误解。
MPI_Init()
和MPI_Finalize()
不标记并行处理的开始和结束。它们标记允许其他MPI调用的开始和结束。 MPI运行整个程序的多个独立实例,每个实例都有自己独立的内存空间。是的,每个流程都有自己的a
和i
。