У меня есть указатель на список указателей (каждый указатель списка указывает на строку) Мне нужно "раскидать" список указателей так, чтобы у каждого процессора было определенное количество строк. Я делаю пример, чтобы сказать, как я хочу назначать указатели. Если список состоит из 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);
}