我是MPI的新手,我正在尝试编写使用MPI_scatter的程序。我有4个节点(0,1,2,3)。 Node0是master,其他是slave。 Master询问用户要发送给从属的数组元素的数量。然后它创建大小数量的元素数组* 4.然后每个节点打印它的结果。
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define MASTER 0
int main(int argc, char **argv) {
int id, nproc, len, numberE, i, sizeArray;
int *arrayN=NULL;
int arrayNlocal[sizeArray];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (id == MASTER){
printf("Enter number of elements: ");
scanf("%d", &numberE);
sizeArray = numberE * 4;
arrayN = malloc(numberE * sizeof(int));
for (i = 0; i < sizeArray; i++){
arrayN[i] = i + 1;
}
}
MPI_Scatter(arrayN, numberE, MPI_INT, &arrayNlocal, numberE,MPI_INT, MPI_COMM_WORLD);
printf("Node %d has: ", id);
for (i = 0; i < numberE; i++){
printf("%d ",arrayNlocal[i]);
}
MPI_Finalize();
return 0;
}
正如我得到的错误:
BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
PID 9278 RUNNING AT 192.168.100.100
EXIT CODE: 139
CLEANING UP REMAINING PROCESSES
YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
答案 0 :(得分:1)
在arrayNlocal[sizeArray];
中,sizeArray
未初始化。最好的方法是向每个进程广播numberE
并为arrayNlocal
分配内存。类似的东西:
MPI_Bcast( &numberE, 1, MPI_Int, 0, MPI_COMM_WORLD)
arrayN
是一个大小为sizeArray = numberE * 4
的数组,因此:
arrayN = malloc(sizeArray * sizeof(int));
MPI_Scatter()
需要指向要在根节点上发送的数据的指针,以及指向通信器的每个进程上的接收缓冲区的指针。由于arrayNlocal
是一个数组:
MPI_Scatter(arrayN, numberE, MPI_INT, arrayNlocal, numberE,MPI_INT,MASTER, MPI_COMM_WORLD);
或者:
MPI_Scatter(arrayN, numberE, MPI_INT, &arrayNlocal[0], numberE,MPI_INT,MASTER, MPI_COMM_WORLD);
id
未在id == MASTER
中初始化:它必须为rank==MASTER
。原样,最后的打印可能以进程之间的混合方式发生。
尝试使用mpicc main.c -o main -Wall
编译代码以启用所有警告:它可以在不久的将来为您节省几个小时!