MPI GRAPH : ส่งข้อความถึงเพื่อนบ้าน ยกเว้นแหล่งที่มา

ฉันมีสถานการณ์ที่ตลกที่นี่ ฉันกำลังพยายามให้มีโหนดในกราฟเพื่อส่งข้อความไปยังเพื่อนบ้านทั้งหมด ยกเว้นโหนดหลัก (โหนดที่เพิ่งส่งข้อความ) ดูเหมือนว่ารหัสที่ฉันมีจะแสดงให้เห็นว่าโหนดเฉพาะนี้ ( n ) ได้รับข้อความจากเพื่อนบ้านทั้งหมด (correct ) ปัญหามีไว้เพื่อส่ง เฉพาะข้อความแรกที่มาถึงเท่านั้นที่จะถูกส่ง ส่วนอื่นๆ ทั้งหมดจะถูกละเลย หมายเหตุ : นี่คือโทโพโลยีแบบดาวที่มีโหนดอื่นๆ ทั้งหมดที่ส่งไปยังโหนดกลาง 0 นี่คือตัวอย่างเอาต์พุต :-

  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 .

ฉันโชคไม่ดีที่ได้รับอย่างอื่น เฉพาะข้อความแรกเท่านั้นที่ถูกส่งไปยังโหนดอื่นและส่วนที่เหลือถูกละเลยนั่นคือ ถ้า 1 ได้รับก่อนด้วย 0 ฉันจะได้รับผลลัพธ์ต่อไปนี้เท่านั้น:-

  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

ข้อความอื่นๆ ทั้งหมดจะไม่ถูกส่ง

นี่คือลักษณะของโค้ดในโหนดกลางของโทโพโลยีกราฟดาว:-

     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 แหล่งที่มา
comment
ยากที่จะบอกได้จากตัวอย่างโค้ดล่าสุด แต่คุณมีวงนอกบางประเภทที่วนซ้ำผ่านข้อความที่ได้รับแล้วส่งทีละรายการไปยังเพื่อนบ้านที่เหมาะสม หรือคุณส่งข้อความใดๆ ที่ได้รับทันที จากนั้นกลับไปที่ MPI_Recv() ? คุณช่วยกรุณาใส่โค้ดเพิ่มเติมเพื่อให้เข้าใจได้ดีขึ้นว่าโค้ด (ไม่) กำลังทำอะไรอยู่   -  person maddouri    schedule 10.10.2015
comment
สวัสดี ขอบคุณ ฉันเพิ่งแก้ไขโค้ดโดยไม่มีการวนซ้ำภายนอก ดูเหมือนฉันจะเข้าใจวิธีคิดของคุณนะ ดูเหมือนคุณจะแนะนำให้ฉันใส่โค้ดทั้งหมดในการวนซ้ำ cout_neighbours - 1 ครั้ง?   -  person Walker    schedule 10.10.2015
comment
ใช่! น่าจะใช้บางอย่างเช่น 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
นั่นเป็นตรรกะ แต่โค้ดจะค้างหลังจากเสร็จสิ้น แม้ว่าจะค้างแค่การวนซ้ำครั้งแรก แต่ได้รับข้อความทั้งหมดแล้ว   -  person Walker    schedule 10.10.2015
comment
เนื่องจากคุณมี 6 เพื่อนบ้านสำหรับโหนด 0 ลองกำหนด int message[6]; และเรียก MPI_Recv(message , 6, MPI_INT , MPI_ANY_SOURCE , echo_tag, COMM, &status ); เพียงครั้งเดียวก่อนที่จะเข้าสู่วงนอกเพื่อวนรอบหรือไม่ นอกจากนี้ คุณอาจต้องเปลี่ยนการโทรเป็น MPI_Send() เป็น MPI_Send(&message[messageIdx] , 1 , MPI_INT , current_neighbour , tag, COMM ); ตามที่กล่าวไว้ ที่นี่ คุณควรใช้ MPI_Get_count() เพื่อรับ TOTAL_NUMBER_OF_EXPECTED_MESSAGES จริงก่อนเข้าสู่วงรอบนอก   -  person maddouri    schedule 10.10.2015


คำตอบ (1)


คุณต้องมีสองเท่าสำหรับงานเช่นนี้

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