MPI_Gather sepertinya tidak berfungsi

Saya perlu menggunakan fungsi MPI_Gather dalam program Perkalian Matriks saya tetapi saya menghadapi masalah selama beberapa hari terakhir.

Oleh karena itu saya menulis program MPI sederhana menggunakan fungsi Gather saja dan telah mencoba menjalankannya... Untuk ini saya mengacu pada buku 'Pengantar Pemrograman Paralel oleh Peter Pacheco'.

Program langsung keluar, sama sekali tidak memberi saya hasil atau kesalahan... Saya belum dapat menemukan kesalahannya sampai sekarang.

   /******************NOTE**********************

      The program simply uses the MPI_Gather() function. 
      The program is exiting directly.
      I have written it for only TWO processes.
      (-np 2)

   ******************************************/

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

    int main()
    {
     int i,j,proc,rank;
     double d[4];
     double local_a[2];


     MPI_Init(NULL,NULL);
     MPI_Comm_size(MPI_COMM_WORLD, &proc);
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);

     if(rank==0)
     { 

       local_a[0]=1.0;
       local_a[1]=2.0;
     }

     else
     {
       local_a[0]=3.0;
       local_a[1]=4.0;
     }

     int local=2;

     if(rank==0)
     {   

       MPI_Gather(local_a,local,MPI_DOUBLE,d,local,MPI_DOUBLE,0,MPI_COMM_WORLD);
     //MPI_Gather(&local_a,local,MPI_DOUBLE,&d,local,MPI_DOUBLE,0,MPI_COMM_WORLD);
     //also tried the above line just to be certain.


       printf("\n");
       for(j=0;j<4;j++)
         printf("\t%f",d[j]);
     }
     else
     {
       MPI_Gather(local_a,local,MPI_DOUBLE,d,local,MPI_DOUBLE,0,MPI_COMM_WORLD);
     //MPI_Gather(&local_a,local,MPI_DOUBLE,&d,local,MPI_DOUBLE,0,MPI_COMM_WORLD); 
     }

     MPI_Finalize();

     return 0;

    }

Bisakah seseorang membantu saya keluar.

Terima kasih.

Anagha Madhusudanan


c mpi
person user1715985    schedule 03.10.2012    source sumber
comment
apa kesalahanmu? Bagaimana kami dapat membantu tanpa mengetahui kesalahan apa yang Anda dapatkan untuk kode yang dikompilasi dan berjalan dengan baik di sistem saya   -  person pyCthon    schedule 04.10.2012


Jawaban (1)


Program Anda berfungsi dengan baik untuk saya, memberikan output:

    1.000000    2.000000    3.000000    4.000000

Bisakah Anda berbagi informasi lebih lanjut tentang cara Anda menjalankan dan mengkompilasi file yang dapat dieksekusi, sehingga saya akan mencoba mereproduksi kesalahan dan mengedit jawabannya?

Sekadar informasi, Anda dapat menemukan di bawah ini versi program yang sedikit dimodifikasi yang membuktikan bahwa buffer penerimaan hanya dapat dialokasikan pada root:

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

int main() {

  int rank     = -1;
  int commsize = -1;
  double sendbuffer[2];

  MPI_Init(NULL,NULL);
  MPI_Comm_size(MPI_COMM_WORLD, &commsize);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  sendbuffer[0]=2.0*rank;
  sendbuffer[1]=2.0*rank + 1;

  int count=2;

  if(rank==0) {   

    // Recvbuffer is significant only at root
    double * recvbuffer = malloc(2*commsize*sizeof(double));
    // Gather values at root
    MPI_Gather(sendbuffer,count,MPI_DOUBLE,recvbuffer,count,MPI_DOUBLE,0,MPI_COMM_WORLD);
    // Print to screen
    printf("\n");
    for(int jj=0; jj<2*commsize ;jj++)
      printf("%f\n",recvbuffer[jj]);
    // Free recvbuffer
    free(recvbuffer);

  } else {
    MPI_Gather(sendbuffer,count,MPI_DOUBLE,NULL,0,MPI_DOUBLE,0,MPI_COMM_WORLD);
  }

  MPI_Finalize();

  return 0;

}
person Massimiliano    schedule 03.10.2012
comment
Seseorang juga dapat menggunakan pengumpulan di tempat untuk hanya menggunakan satu buffer di peringkat master. - person Hristo Iliev; 04.10.2012