MPI_Scatter 接收错误的值

问题描述 投票:0回答:1

我的目标是把一个6个整数的数组分给3个进程,但receiveBuffer中的数字并不正确。但是,receiveBuffer中的数字并不正确,我不知道为什么三个进程中不包含原来数组中的整数。我不知道为什么这三个进程不包含原始数组中的整数。

#include<stdio.h> 
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include "mpi.h"

#define ARRAY_SIZE 6

// simple print array method
void printArray(int arr[], int size) 
{ 
    int i; 
    for (i=0; i < size; i++) 
        printf("%d ", arr[i]); 
    printf("\n"); 
} 

int main (int argc, char *argv[])
{
    srand(time(NULL));

    int array[ARRAY_SIZE];
    int rank, numNodes;

    // fill array with random numbers and print
    for(int i = 0; i < ARRAY_SIZE; i++)
        array[i] = rand();

    printArray(array, ARRAY_SIZE); 

    MPI_Init( &argc, &argv );
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size (MPI_COMM_WORLD,&numNodes);

    int receiveBuffer[ARRAY_SIZE/numNodes];

    if(rank == 0)
    {
        MPI_Scatter(array, ARRAY_SIZE/numNodes, MPI_INT, &receiveBuffer, 0, MPI_INT, rank, MPI_COMM_WORLD);
    }

    printf("ID: %d with %d items.\n", rank, ARRAY_SIZE/numNodes);
    printArray(receiveBuffer, ARRAY_SIZE/numNodes);

    MPI_Finalize();
    return 0;
}

另外,为什么每个进程都要打印原始数组?并行化不是在INIT之后才开始的吗?

c mpi
1个回答
0
投票

有两个问题与你对 MPI_Scatter()

  • MPI_Scatter() 是一个集体操作,因此必须被通信者的所有等级所调用(例如,不仅仅是等级0)。
  • 既然你用 MPI_INT 对于发送和接收数据类型,发送和接收计数应该相等(例如使用 ARRAY_SIZE/numNodes 而不是 0)

MPI标准并没有明确规定在 MPI_Init(),而且很常见的是 mpirun 生成所有的任务,因此它们都会在 MPI_Init(). 这就是为什么 MPI_Init() 一般在MPI程序开始时调用。

© www.soinside.com 2019 - 2024. All rights reserved.