2015-11-18 15 views
1

Я новичок в MPI, и я пытаюсь написать программу, которая использует MPI_scatter. У меня 4 узла (0, 1, 2, 3). Node0 является мастером, другие - подчиненными. Мастер запрашивает у пользователя количество элементов массива для отправки ведомым. Затем он создает массив из числа элементов * 4. Затем каждый узел печатает его результаты.MPI_scatter из массива 1D

#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

'arrayN' должен быть' int * 'вместо' int' и 'arrayN = i + 1;' должен быть 'arrayN [i] = i + 1;'. – mch

+0

На самом деле у меня это так, я просто ошибся при переписывании кода, потому что у меня есть мои узлы как vm. Я думаю, что проблема связана с numberE, потому что если я изменяю числоE на 2, и если ввод равен 2, то работает код – cirval

ответ

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, чтобы включить все предупреждения: он может сэкономить вам несколько часов в ближайшем будущем!

+1

У вас есть аргумент «root», отсутствующий в ваших вызовах MPI_Scatter. – macelee

+0

@ macelee: вы правы! Я исправлю эту ошибку, которая также встречается в коде, предоставленном айзером. Спасибо за ваше точное замечание! – francis

Смежные вопросы