MPI отправляет указатели revc

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

person Wellen    schedule 29.01.2014    source источник
comment
В чем именно заключается ваш вопрос? Вы получаете ошибки компилятора или проблемы во время выполнения?   -  person Hulk    schedule 29.01.2014
comment
У меня ошибка сегментации... Я думаю, что проблема в последней части кода   -  person Wellen    schedule 29.01.2014
comment
@HighPerformanceMark спасибо, я понимаю свою ошибку!   -  person Wellen    schedule 29.01.2014


Ответы (1)


Комментарий преобразован в ответ в погоне за тщеславной репутацией ... (и немного более благородном стремлении предоставить приемлемый ответ для будущих поколений)

Я не уверен, что полностью понимаю ваш код, но нет смысла отправлять указатели из одного процесса в другой. Указатели указывают на места в локальном адресном пространстве процесса, и нельзя ожидать, что они будут указывать на конкретное место в локальном адресном пространстве другого процесса. Действительно, нельзя ожидать, что они продолжат указывать на какое-либо место в локальном адресном пространстве другого процесса.

person High Performance Mark    schedule 29.01.2014
comment
Означает ли это, что я буду вынужден всегда медленно отправлять данные по значению и никогда по ссылке? Также не могли бы вы уточнить, почему MPI работает таким образом, в конце концов, то есть 4 ядра на моем ноутбуке используют одну и ту же память? (не в более крупном суперкомпьютере с большим количеством узлов и т. д.) - person AtmosphericPrisonEscape; 25.05.2015
comment
Ну было 2 вопроса. Но я перефразирую: на моем ноутбуке с 4 ядрами, где я предполагаю, что у меня есть общая память для всех них, я могу запускать OpenMP, а также MPI-код. Однако при использовании MPI-посылок мне всегда приходится копировать данные, что происходит медленно. Я не могу рассылать ссылки, что было бы быстро. (правильно?) То есть OpenMP с общей памятью в любом случае является естественным выбором, не так ли? - person AtmosphericPrisonEscape; 26.05.2015
comment
Вы пропустили мою мысль - задайте вопрос. Не задавайте вопросы в комментариях. - person High Performance Mark; 26.05.2015