MPI сбор и qsort

#c #mpi

#c #mpi

Вопрос:

Я пытаюсь выполнить простую сортировку, при которой каждая ненулевая процедура считывает файл (filename = proc #) в буфер. Нулевой процесс собирает все эти буферы, сортирует их и затем распечатывает. Однако в следующем коде процесс 0 собирает буфер proc1, но не процесс 2. Есть предложения?

Я выполняю его с помощью mpirun -np 3 a.out

мои входные файлы — это имя файла: «1» 40 10 100

Имя файла: «2» 90 20 25

и код:

 #include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

#define DEBUG 1

//#undef DEBUG


int compare (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main (int argc, char *argv[])
{
int values[3];
int recv[3];
int n, i=0, temp;
FILE *in1, *in2;
int rank, size;
MPI_Init(amp;argc, amp;argv);
MPI_Comm_rank(MPI_COMM_WORLD, amp;rank);
char filename[20];
if(rank!=0){
      // read files with filename"<proc#>" into the buffer
      sprintf(filename, "%d", rank);
      in1=fopen(filename,"r");
      while(fscanf(in1,"%d",amp;values[i]) != EOF){
            printf("rank %d Read data %dn", rank,values[i]);
            i  ;
      }
 }
 // gather values from all procs.

 MPI_Gather(values,i,MPI_INT,recv,i,MPI_INT,0,MPI_COMM_WORLD);
 printf("Gather done!");
if(rank==0){


    // sort
    qsort (recv, 6, sizeof(int), compare);
    // print results
    for (n=0; n<6; n  )
            printf ("%d ",recv[n]);
    printf("n");
 }

 if(rank!=0)
    fclose(in1);
 MPI_Finalize();
 return 0;
}
  

Комментарии:

1. я отредактировал свой ответ. Я думаю, что размер буфера приемника должен быть 9, проверьте это сейчас…

Ответ №1:

 int recv[3];
  

размер принимающего буфера должен быть общим количеством элементов от всех процессоров, которые должны быть собраны на сборном узле.
так что recv [9] должен работать здесь.

проверьте этот пример для примера сбора