MPI ส่งตัวชี้ revc

ฉันมีตัวชี้ไปยังรายการพอยน์เตอร์ (แต่ละพอยน์เตอร์ของรายการชี้ไปที่แถว) ฉันต้อง "กระจาย" รายการพอยน์เตอร์เพื่อให้โปรเซสเซอร์แต่ละตัวมีจำนวนแถวที่แน่นอน ฉันยกตัวอย่างเพื่อบอกว่าฉันต้องการกำหนดพอยน์เตอร์อย่างไร หากรายการประกอบด้วยพอยน์เตอร์ 5 ตัวและมีโปรเซสเซอร์ 2 ตัว ฉันต้องการให้โปรเซสเซอร์ 0 มีพอยน์เตอร์ 4 0 1 2 3 และโปรเซสเซอร์ 1 มี 2 3 4 0 (ซึ่งหมายความว่าโปรเซสเซอร์แต่ละตัวมีพอยน์เตอร์ตัวสุดท้ายของโปรเซสเซอร์รุ่นก่อนหน้าและตัวชี้ตัวแรก ของโปรเซสเซอร์ต่อไปนี้)

นี่เป็นส่วนหนึ่งของรหัส:

int **vptr = NULL;
if(rank==0){
    vptr = m.ptr();
}
//this definition comes from one of my class methods

จากนั้นฉันก็มีโค้ดส่วนนี้ที่ตัดสินใจว่าจะกำหนดแถวให้กับแต่ละกระบวนการอย่างไร (สมมติว่าในตอนแรกโปรเซสเซอร์แต่ละตัวมีเพียงแถวที่ผู้อื่นไม่มี)

int *elem;
elem = new int[p]; //number of rows for process
int *disp;
disp = new int[p]; //index first row of the process
int split = N / p;
int extra = N % p;

    for(unsigned i = 0; i < extra; i++){
        elem[i] = split + 1;
    }
    for(unsigned i = extra; i < p; i++){
        elem[i] = split;
    }

    disp[0] = 0;
    for(unsigned i = 1; i < p; i++){
        disp[i] = disp[i-1] + elem[i-1];
    }

int local_n = elem[rank]; //number of rows for this process
int local_f = disp[rank]; //index first row for this process

int *local_v;
local_v = new int[local_n + 2]; //+2 because now I consider that I also need the row above and the row below

ที่นี่ฉันต้องใช้ MPI_Send และ MPI_Recv ฉันคิดว่าฉันกำลังทำข้อผิดพลาดหรือพอยน์เตอร์

    if(rank==0){
        for(unsigned j = 0; j < local_n + 2; j++){
            local_v[j] = *vptr[j];
        }
        for(unsigned i = 1; i < p; i++){
            MPI_Send(&vptr[disp[i]-1], elem[i] + 2, MPI_INT, i, 1, MPI_COMM_WORLD);
        }
    }else{
        MPI_Recv(&local_v[0], local_n + 2, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }

person Wellen    schedule 29.01.2014    source แหล่งที่มา
comment
คำถามของคุณคืออะไรกันแน่? คุณได้รับข้อผิดพลาดของคอมไพเลอร์หรือปัญหารันไทม์หรือไม่?   -  person Hulk    schedule 29.01.2014
comment
ฉันมีข้อผิดพลาดในการแบ่งส่วน... ฉันคิดว่าปัญหาอยู่ที่ส่วนสุดท้ายของโค้ด   -  person Wellen    schedule 29.01.2014
comment
@HighPerformanceMark ขอบคุณ ฉันเข้าใจข้อผิดพลาดของฉัน!   -  person Wellen    schedule 29.01.2014


คำตอบ (1)


ความคิดเห็นถูกแปลงเป็นคำตอบเพื่อแสวงหาชื่อเสียงอันรุ่งโรจน์ ... (และการแสวงหาที่สูงส่งกว่าเล็กน้อยในการให้คำตอบที่ยอมรับได้สำหรับคนรุ่นต่อ ๆ ไป)

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

person High Performance Mark    schedule 29.01.2014
comment
นั่นหมายความว่าฉันจะถูกบังคับให้ส่งข้อมูลช้าๆ ตามค่าและไม่ต้องอ้างอิงเลยใช่หรือไม่ คุณช่วยอธิบายเพิ่มเติมได้ไหมว่าเหตุใด MPI จึงทำงานเช่นนั้น กล่าวคือ 4 คอร์บนแล็ปท็อปของฉันใช้หน่วยความจำเดียวกัน (ofc ไม่ได้อยู่ในซูเปอร์คอมพิวเตอร์ที่ใหญ่กว่าและมีโหนดมากกว่า ฯลฯ ) - person AtmosphericPrisonEscape; 25.05.2015
comment
มีคำถาม 2 ข้อครับ แต่ฉันจะใช้ถ้อยคำใหม่: บนแล็ปท็อปของฉันที่มี 4 คอร์ ซึ่งฉันคิดว่าฉันได้แชร์หน่วยความจำสำหรับคอร์ทั้งหมด ฉันสามารถเรียกใช้ OpenMP เช่นเดียวกับโค้ด MPI อย่างไรก็ตาม เมื่อใช้ MPI-send ฉันจะต้องคัดลอกข้อมูลของฉันเสมอ ซึ่งช้า ฉันไม่สามารถส่งข้อมูลอ้างอิงได้ ซึ่งจะรวดเร็ว (ถูกต้องไหม?) ดังนั้นการแชร์หน่วยความจำ OpenMP จึงเป็นทางเลือกที่เป็นธรรมชาติใช่ไหม - person AtmosphericPrisonEscape; 26.05.2015
comment
คุณพลาดประเด็นของฉัน - ถามคำถาม อย่าใส่คำถามในความคิดเห็น - person High Performance Mark; 26.05.2015