到目前为止,我的应用程序正在读取一个包含整数列表的 txt 文件。这些整数需要由主进程(即等级为 0 的处理器)存储在一个数组中。这工作正常。
现在,当我运行程序时,我有一个 if 语句检查它是否是主进程,如果是,我正在执行MPI_Scatter
命令。
据我了解,这将用数字细分数组并将其传递给从属进程,即所有 rank > 0 。但是,我不确定如何处理MPI_Scatter
. 从进程如何“订阅”获取子数组?如何告诉非主进程对子阵列做某事?
有人可以提供一个简单的示例,向我展示主进程如何从数组中发送元素,然后让从属进程将总和返回给主进程,主进程将所有总和加在一起并打印出来?
到目前为止我的代码:
#include <stdio.h>
#include <mpi.h>
//A pointer to the file to read in.
FILE *fr;
int main(int argc, char *argv[]) {
int rank,size,n,number_read;
char line[80];
int numbers[30];
int buffer[30];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
fr = fopen ("int_data.txt","rt"); //We open the file to be read.
if(rank ==0){
printf("my rank = %d\n",rank);
//Reads in the flat file of integers and stores it in the array 'numbers' of type int.
n=0;
while(fgets(line,80,fr) != NULL) {
sscanf(line, "%d", &number_read);
numbers[n] = number_read;
printf("I am processor no. %d --> At element %d we have number: %d\n",rank,n,numbers[n]);
n++;
}
fclose(fr);
MPI_Scatter(&numbers,2,MPI_INT,&buffer,2,MPI_INT,rank,MPI_COMM_WORLD);
}
else {
MPI_Gather ( &buffer, 2, MPI_INT, &numbers, 2, MPI_INT, 0, MPI_COMM_WORLD);
printf("%d",buffer[0]);
}
MPI_Finalize();
return 0;
}