ฉันมีตัวชี้ไปยังรายการพอยน์เตอร์ (แต่ละพอยน์เตอร์ของรายการชี้ไปที่แถว) ฉันต้อง "กระจาย" รายการพอยน์เตอร์เพื่อให้โปรเซสเซอร์แต่ละตัวมีจำนวนแถวที่แน่นอน ฉันยกตัวอย่างเพื่อบอกว่าฉันต้องการกำหนดพอยน์เตอร์อย่างไร หากรายการประกอบด้วยพอยน์เตอร์ 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);
}