MPI mengirimkan petunjuk revc

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);
    }

person Wellen    schedule 29.01.2014    source sumber
comment
Apa sebenarnya pertanyaan Anda? Apakah Anda mendapatkan kesalahan kompiler atau masalah runtime?   -  person Hulk    schedule 29.01.2014
comment
Saya memiliki kesalahan segmentasi... Saya pikir masalahnya ada di bagian terakhir kode   -  person Wellen    schedule 29.01.2014
comment
@HighPerformanceMark terima kasih, saya memahami kesalahan saya!   -  person Wellen    schedule 29.01.2014


Jawaban (1)


Komentar diubah menjadi jawaban demi mengejar reputasi yang membanggakan ... (dan upaya yang sedikit lebih mulia dalam memberikan jawaban yang dapat diterima untuk generasi mendatang)

Saya tidak yakin saya sepenuhnya memahami kode Anda, tetapi tidak ada gunanya mengirimkan petunjuk dari satu proses ke proses lainnya. Pointer menunjuk ke lokasi di ruang alamat lokal suatu proses dan tidak dapat diharapkan menunjuk ke lokasi spesifik di ruang alamat lokal dari proses lain. Memang benar, mereka tidak dapat diharapkan untuk terus menunjuk ke lokasi mana pun di ruang alamat lokal dari proses lain

person High Performance Mark    schedule 29.01.2014
comment
Apakah itu berarti saya akan dipaksa untuk selalu mengirimkan data secara perlahan berdasarkan nilai dan tidak pernah berdasarkan referensi? Bisakah Anda menjelaskan mengapa MPI bekerja seperti itu, yaitu 4 core di laptop saya berbagi memori yang sama? (tentu saja tidak di superkomputer yang lebih besar dengan lebih banyak node, dll.) - person AtmosphericPrisonEscape; 25.05.2015
comment
Ya, ada 2 pertanyaan. Tapi saya akan ulangi: Di ​​laptop saya dengan 4 core, di mana saya berasumsi saya telah berbagi memori untuk semuanya, saya dapat menjalankan OpenMP serta kode MPI. Namun dengan menggunakan pengiriman MPI saya harus selalu menyalin data saya, dan ini lambat. Saya tidak bisa mengirimkan referensi, itu akan cepat. (benar?) Jadi karena berbagi memori OpenMP adalah pilihan yang wajar, bukan? - person AtmosphericPrisonEscape; 26.05.2015
comment
Anda melewatkan maksud saya -- ajukan pertanyaan. Jangan mengajukan pertanyaan di komentar. - person High Performance Mark; 26.05.2015