Saya memiliki penunjuk ke daftar penunjuk (setiap penunjuk daftar menunjuk ke satu baris). Saya perlu "menyebarkan" daftar penunjuk sehingga setiap prosesor memiliki jumlah baris tertentu. Saya membuat contoh untuk mengatakan bagaimana saya ingin menetapkan petunjuk. Jika daftar terdiri dari 5 pointer dan ada 2 prosesor, saya ingin processor0 memiliki pointer 4 0 1 2 3 dan processor1 memiliki 2 3 4 0 (artinya setiap prosesor memiliki pointer terakhir dari prosesor sebelumnya dan pointer pertama dari prosesor berikut)
Ini adalah bagian dari kode:
int **vptr = NULL;
if(rank==0){
vptr = m.ptr();
}
//this definition comes from one of my class methods
lalu saya memiliki bagian kode ini yang memutuskan cara menetapkan baris untuk setiap proses (dengan asumsi sejak awal bahwa setiap prosesor hanya memiliki baris yang tidak dimiliki oleh prosesor lain)
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
di sini saya perlu menggunakan MPI_Send dan MPI_Recv, saya kira saya membuat kesalahan atau dengan petunjuknya
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);
}