ฉันมีปัญหากับ MPI_Isend
และ MPI_Irecv
ฉันกำลังทำงานกับเมทริกซ์ adjacency ของกราฟ ซึ่งมีการกระจายตามแถว เราสามารถถือว่าโปรเซสเซอร์แต่ละตัวมีหนึ่งแถว สำหรับดัชนีแต่ละคู่ (i,j)
ฉันต้องส่งและรับจำนวนเต็ม 2 ตัว โดยพื้นฐานแล้ว ฉันจำเป็นต้องได้รับข้อมูลอื่นจากแถวอื่นเพื่อที่จะทำการคำนวณ ฉันเป็นคนใหม่ใน MPI และที่นี่มันจะเข้าสู่วงวนไม่สิ้นสุด ฉันไม่แน่ใจว่ามันเป็นวิธีที่ถูกต้องในการใช้ MPI_Isend
หรือ MPI_Irecv
in a for loop รวมถึงเป็นสถานที่ในการรอด้วย
ตามตัวอย่าง สมมติว่าเรามีกราฟที่มีจุดยอด 6 จุด ดังนั้นเมทริกซ์ adjacency (adjMatrix
) จะเป็นเมทริกซ์ขนาด 6*6 เราก็มีเมทริกซ์ขนาด 6*2 สำหรับข้อมูลอื่นๆ ด้วย และสุดท้าย เราก็กระจาย ข้อมูลระหว่างโปรเซสเซอร์ 6 ตัว ดังนั้น:
|0 20 16 0 6 0 | |0 1|
|20 0 0 19 0 6 | |1 1|
addMatrix=|16 0 0 0 12 0 | M=|2 1|
|0 19 0 0 0 12| |3 1|
|6 0 12 0 0 9 | |0 0|
|0 6 0 12 9 0 | |1 0|
เรากระจายเมทริกซ์ดังนี้:
P0: |0 20 16 0 6 0 | |0 1|
P1: |20 0 0 19 0 6 | |1 1|
P2: |16 0 0 0 12 0 | |2 1|
P3: |0 19 0 0 0 12| |3 1|
P4: |6 0 12 0 0 9 | |0 0|
P5: |0 6 0 12 9 0 | |1 0|
ขณะนี้ โปรเซสเซอร์แต่ละตัวจำเป็นต้องอัปเดตส่วนของ adjMatrix
ในการทำเช่นนั้น พวกเขาต้องการข้อมูลจากบางส่วนของเมทริกซ์ M
ซึ่งอยู่ในโปรเซสเซอร์อื่นๆ ตัวอย่างเช่น ในการ P0
อัปเดตดัชนี (0,1)
ซึ่งก็คือ 20
จะต้องมีสิทธิ์เข้าถึงแถว 1
ของเมทริกซ์ M
ซึ่งก็คือ {1,1}
ดังนั้น:
P1
ควรส่งMLocal[0][0]=1
และMLocal[0][1]=1
ไปที่P0
โดยที่P0
ได้รับเป็นM_j0
และM_j1
ตามลำดับและ
P0
ควรส่งMLocal[0][0]=0
และMLocal[0][1]=1
ไปที่P1
โดยที่P1
ได้รับเป็นM_j0
และM_j1
ตามลำดับ
for(int i=0;i<rows;i++){
for (int j=0; j<n; j++)
{
int M_j0,M_j1;
MPI_Isend(&MLocal[i][0], 1, MPI_INT, j, my_rank+i*n+j+0, MPI_COMM_WORLD, &send_request0);
MPI_Isend(&MLocal[i][1], 1, MPI_INT, j, my_rank+i*n+j+1, MPI_COMM_WORLD, &send_request1);
MPI_Irecv(&M_j0, 1, MPI_INT, j, my_rank+i*n+j+0, MPI_COMM_WORLD, &recv_request0);
MPI_Irecv(&M_j1, 1, MPI_INT, j, my_rank+i*n+j+1, MPI_COMM_WORLD, &recv_request1);
//MPI_Wait(&send_request0, &status);
//MPI_Wait(&send_request1, &status);
MPI_Wait(&recv_request0, &status);
MPI_Wait(&recv_request1, &status);
// Do something ...
}
}
จากนั้นด้วยคำแนะนำของ GillesGouaillardet ฉันเปลี่ยน 4 MPI_Isend
และ MPI_Irecv
เป็น:
MPI_Sendrecv(&MoatsLocal[i][0], 1, MPI_INT, j, my_rank+i*n+j+0, &M_j0,1, MPI_INT, my_rank, my_rank+i*n+j+0, MPI_COMM_WORLD, &status);
MPI_Sendrecv(&MoatsLocal[i][1], 1, MPI_INT, j, my_rank+i*n+j+1, &M_j1,1, MPI_INT, my_rank, my_rank+i*n+j+1, MPI_COMM_WORLD, &status);
แต่กระนั้น มันก็เข้าสู่วงวนไม่สิ้นสุด
อัปเดต:
ฉันอัปเดตโค้ดแล้ว ส่วนหนึ่งของปัญหาเกิดจากการจัดอันดับโปรเซสเซอร์และการจับคู่แท็ก ฉันแก้ไขส่วนนั้นแล้ว แต่ถึงกระนั้น มันก็มีแนวโน้มที่จะเกิดการหยุดชะงัก ซึ่งฉันคิดว่าฉันรู้ว่าปัญหาอยู่ที่ไหน และอาจแก้ไม่ได้ หากฉันมีตัวประมวลผลเพียงพอ การกระจายแต่ละบรรทัดไปยังตัวประมวลผล เช่น n=p ก็คงไม่เป็นปัญหาใดๆ แต่ปัญหาคือจำนวนโปรเซสเซอร์น้อยกว่า n
ดังนั้นโฟลว์จะไม่ผ่านเส้นทแยงมุมหลักอย่างสวยงาม ผมอธิบายผ่านตัวอย่าง สมมติว่าเรามีโปรเซสเซอร์ 4 ตัวและ n=6
สมมติว่านี่คือการกระจาย:
P0: |0 20 16 0 6 0 | |0 1|
P1: |20 0 0 19 0 6 | |1 1|
|16 0 0 0 12 0 | |2 1|
P2: |0 19 0 0 0 12| |3 1|
P3: |6 0 12 0 0 9 | |0 0|
|0 6 0 12 9 0 | |1 0|
นี่คือสิ่งที่เกิดขึ้นในวง
การทำซ้ำครั้งแรก:
P0 ส่งและรับข้อมูล P1 สำหรับ (0,1): "20" และรอ (เสร็จสิ้น)
P1 ส่งและรับข้อมูล P0 สำหรับ (1,0): "20" และรอ (เสร็จสิ้น)
P2 ส่งและรับข้อมูล P1 สำหรับ (3,1): "19" แล้วรอ
P3 ส่งและรับข้อมูล P0 สำหรับ (4,1):"6" และรอ
การทำซ้ำครั้งที่สอง:
P0 ส่งและรับข้อมูล P1 สำหรับ (0,2): "16" แล้วรอ
P1 ส่งและรับข้อมูล P2 สำหรับ (1,3): "19" และรอ (เสร็จสิ้น)
P2 กำลังรอ P1 (3,1):"19" จากนั้นก็รับและทำเสร็จแล้ว!
P3 กำลังรอ P0 สำหรับ (4,1):"6" และรอ
การทำซ้ำครั้งที่สาม:
P0 กำลังรอ P1 สำหรับ (0,2):"16"
P1 ส่งและรับข้อมูล P3 ไปยัง (1,5): "19" แล้วรอ
P2 ส่งและรับข้อมูล P3 ไปยัง (3,5): "12" แล้วรอ
P3 กำลังรอ P0 สำหรับ (4,1):"6"
การทำซ้ำครั้งที่สี่:
P0 กำลังรอ P1 สำหรับ (0,2):"16"
P1 กำลังรอ P3 สำหรับ (1,5): "19"
P2 กำลังรอ P3 สำหรับ (3,5):"12"
P3 กำลังรอ P0 สำหรับ (4,1):"6"
ตอนนี้ทุกคนรอกันอยู่ไม่คิดว่าจะมีวิธีแก้ไขอะไร วิธีแก้ปัญหาที่ ptb แนะนำอาจใช้ได้ ฉันจะลองใช้วิธีนั้น
อย่างไรก็ตาม เรายังชื่นชมแนวคิดอื่นๆ อีกด้วย!
MPI_Waitall(4, ...);
- person Gilles Gouaillardet   schedule 04.04.2018MPI_Sendrecv()
สองอันก็ได้ - person Gilles Gouaillardet   schedule 04.04.2018MPI_Waitall(4, ...)
หรือยัง? นั่นน่าจะมีโอกาสเกิดการหยุดชะงักน้อยลง - person Gilles Gouaillardet   schedule 05.04.2018