MPI_Scatter получает неправильные значения - PullRequest
0 голосов
/ 06 мая 2020

Моя цель - взять массив из 6 целых чисел и разделить их между 3 процессами. Однако числа в 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?

1 Ответ

0 голосов
/ 06 мая 2020

Есть две проблемы с использованием MPI_Scatter()

  • MPI_Scatter() - это коллективная операция, и, следовательно, она должна выполняться всеми уровнями коммуникатора (например, не только нулевым рангом). )
  • , поскольку вы используете MPI_INT как для типа данных отправки, так и для приема, количество отправлений и приемов должно быть одинаковым (например, используйте ARRAY_SIZE/numNodes вместо 0)

Стандарт MPI не определяет, что происходит до MPI_Init(), и очень часто mpirun порождает все задачи, поэтому все они выполняют код до MPI_Init(). Вот почему MPI_Init() обычно вызывается в самом начале программы MPI.

...