我有一個指針列表指針(列表中的每個指針指向一行) 我需要「散佈」指針列表,以便每個處理器都有一定數量的行。 我舉個例子來說明我想如何分配指針。 如果列表由5個指針組成,並且有2個處理器,我希望處理器0具有指針4 0 1 2 3,處理器1具有2 3 4 0(這意味着每個處理器具有前一個處理器的最後一個指針,下面處理器的指針)MPI發送revc指針
這是代碼的一部分:
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,我想我做的erroror與指針
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);
}
你的問題到底是什麼?你會得到編譯器錯誤或運行時問題? – Hulk
我有一個分段錯誤...我認爲問題是在代碼的最後部分 – Wellen
@HighPerformanceMark謝謝,我明白我的錯誤! – Wellen