到目前为止,我的应用程序正在阅读一个带有整数列表的txt文件。这些整数需要由主进程(即具有等级0的处理器)存储在数组中。这工作正常。从C中如何使用MPI_Scatter和MPI_Gather?
现在,当我运行程序时,我有一条if语句检查它是否是主进程,如果是,我执行MPI_Scatter
命令。
从我的理解,这将用数字细分数组,并将它传递给从属进程,即所有的等级> 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;
}
多么出色答卷。使它非常直接,我看到它现在是如何工作的。我犯了一个错误,就是没有把它看作是集体行动。 非常感谢! – DSF
哇!你救了我的一天,干杯。谢谢 – irobo
比大多数MPI介绍更有帮助 – WakaChewbacca