一维数组的MPI_scatter

时间:2015-11-18 12:58:02

标签: c arrays mpi

我是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

1 个答案:

答案 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编译代码以启用所有警告:它可以在不久的将来为您节省几个小时!