GRAFIK MPI : Mengirim Pesan ke tetangga kecuali dari mana asalnya

Saya punya situasi yang lucu di sini. Saya mencoba memiliki simpul dalam grafik untuk mengirim pesan ke semua tetangganya kecuali induknya (simpul yang baru saja mengirim pesan). Kode yang saya miliki sepertinya menunjukkan bahwa simpul khusus ini( n ) menerima pesan dari semua tetangganya(benar ) . Masalahnya adalah untuk pengiriman, hanya pesan pertama yang tiba yang dikirim. Semua yang lain diabaikan. NB : Ini adalah topologi bintang dengan semua node lainnya dikirim ke node pusat 0 Berikut contoh keluarannya :-

  0    received  1 from 1
  0    received  2 from 2
  0    received  3 from 3
  0    received  4 from 4
  0    received  5 from 5
  0    received  6 from 6


  Having correctly  received these values, node zero(0 ) is expected to send each message to all others in the following pattern  i.e. :-

      0 sent   1 to 2
      0 sent   1 to 3
      0 sent   1 to 4
      0 sent   1 to 5
      0 sent   1 to 6

   , 
      0 sent   2 to 1
      0 sent   2 to 3
      0 sent   2 to 4
      0 sent   2 to 5
      0 sent   2 to 6
    ,
      0 sent   3 to 2
      0 sent   3 to 1
      0 sent   3 to 4
      0 sent   3 to 5
      0 sent   3 to 6

, etc .

Sayangnya saya mendapatkan sebaliknya, hanya pesan pertama yang dikirim ke node lain dan sisanya diabaikan.yaitu. jika 1 diterima pertama kali oleh 0, saya hanya mendapatkan output berikut :-

  0 sent   1 to 2
  0 sent   1 to 3
  0 sent   1 to 4
  0 sent   1 to 5
  0 sent   1 to 6

Semua pesan lainnya tidak terkirim.

Berikut adalah tampilan kode di node pusat topologi grafik bintang :-

     MPI_Recv(&message , 1 , MPI_INT ,  MPI_ANY_SOURCE , echo_tag, COMM, &status ); 

//Sending just received message to neighbors, except to parent :-

    parent = status.MPI_SOURCE;

    for ( int l = 0 ; l< neighbourcount ; l++ ){
         int current_neighbour =  neighbours[l];
          if (  current_neighbour != parent ){
                    MPI_Send(&message , 1 , MPI_INT , current_neighbour , tag, COMM );
          }
    }

person Walker    schedule 09.10.2015    source sumber
comment
Sulit untuk membedakannya dari cuplikan kode terakhir, tetapi apakah Anda memiliki semacam loop luar yang mengulangi pesan yang diterima dan kemudian mengirimkannya satu per satu ke tetangga yang sesuai atau apakah Anda segera mengirim pesan yang diterima lalu kembali ke MPI_Recv() ? Bisakah Anda memasukkan lebih banyak kode untuk mendapatkan gambaran yang lebih baik tentang apa yang (tidak) dilakukan kode tersebut?   -  person maddouri    schedule 10.10.2015
comment
Hai, terima kasih. Saya baru saja mengedit kode, saya tidak memiliki loop luar. Sepertinya aku memahami cara berpikirmu. Sepertinya Anda menyarankan agar saya memasukkan semua kode dalam satu lingkaran yang mengulangi cout_neighbours - 1 kali?   -  person Walker    schedule 10.10.2015
comment
Ya! Mungkin sebaiknya menggunakan sesuatu seperti for (messageIdx = 0; messageIdx < TOTAL_NUMBER_OF_EXPECTED_MESSAGES; ++messageIdx) { MPI_Recv(); /* the for loop for sending to the neighbours */ }   -  person maddouri    schedule 10.10.2015
comment
Itu logis, tetapi kodenya kemudian hang setelah selesai. Meski baru hang pada iterasi pertama, semua pesan sudah diterima.   -  person Walker    schedule 10.10.2015
comment
Karena Anda memiliki 6 tetangga untuk node 0, bagaimana jika mendefinisikan int message[6]; dan memanggil MPI_Recv(message , 6, MPI_INT , MPI_ANY_SOURCE , echo_tag, COMM, &status ); hanya sekali, sebelum memasuki loop for bagian luar? Selain itu, Anda mungkin perlu mengubah panggilan ke MPI_Send() menjadi seperti MPI_Send(&message[messageIdx] , 1 , MPI_INT , current_neighbour , tag, COMM );. Seperti yang disebutkan di sini Anda mungkin harus menggunakan MPI_Get_count() untuk mendapatkan TOTAL_NUMBER_OF_EXPECTED_MESSAGES sebenarnya sebelum memasuki loop for luar.   -  person maddouri    schedule 10.10.2015


Jawaban (1)


Anda memerlukan dobel untuk pekerjaan itu, seperti ini:

int j;
for(j = 0; j < neighbourcount; ++j) {
   for ( int l = 0 ; l< neighbourcount ; l++ ){
         int current_neighbour =  neighbours[l];
          if (  current_neighbour != parent ){
                    MPI_Send(/*send j*/ , 1 , MPI_INT , current_neighbour , tag, COMM );
          }
    }
}
person gsamaras    schedule 09.10.2015