【问题标题】:MPI_scatter of 1D array一维数组的 MPI_scatter
【发布时间】:2016-02-20 05:27:34
【问题描述】:

我是 MPI 新手,我正在尝试编写使用 MPI_scatter 的程序。我有 4 个节点(0、1、2、3)。 Node0 是主节点,其他节点是从节点。 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

【问题讨论】:

  • arrayN 应该是 int* 而不是 intarrayN = i + 1; 应该是 arrayN[i] = i + 1;
  • 其实我是这样的,我只是在重写代码时犯了一个错误,因为我的节点是 vm。我认为问题出在 numberE 上,因为如果我将 numberE 更改为 2 并且输入为 2,则代码有效

标签: c arrays mpi


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

【讨论】:

  • 您的 MPI_Scatter 调用中缺少 'root' 参数。
  • @maclee:你是对的!我将纠正这个错误,这个错误也出现在提问者提供的代码中。感谢您的准确评论!
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2011-07-27
  • 2017-07-09
  • 2015-07-16
  • 2017-08-18
  • 2012-09-13
  • 1970-01-01
  • 2015-01-24
相关资源
最近更新 更多