2014-02-02 2 views
0

У меня возникли проблемы с отправкой массивов с использованием MPI. В настоящее время у меня есть массив, называемый позициями статической памяти. Я постепенно заполняю массив рекурсивным образом. В конце концов, я отправляю массив на подчиненные процессоры для завершения заполнения.Передача массива с постоянной памятью с использованием MPI и C++

const int SIZE = 8; 
const int DEPTH = 3 ; 

void recursion(int column, int positions[SIZE], int rank, int numtasks) { 
    //other code 
    positions[DEPTH] = row; 
    MPI_Send(&positions, SIZE, MPI_INT, r, 1, MPI::COMM_WORLD) ; 
    //other code } 

int main() { 
    int positions[SIZE]; 
    MPI::Init(); 
    rank = MPI::COMM_WORLD.Get_rank(); 
    numtasks = MPI::COMM_WORLD.Get_size(); 
    char name[MPI::MAX_PROCESSOR_NAME]; 
    memset(name,0,MPI::MAX_PROCESSOR_NAME); 
    MPI::Get_processor_name(name,len); 
    memset(name+len,0,MPI::MAX_PROCESSOR_NAME-len); 
    if(rank == MASTER) { 
    recursion(0, positions, rank, numtasks); } 
    if(rank != MASTER) { 
    MPI_Recv(&positions, SIZE, MPI_INT, 0, MPI::ANY_TAG, MPI::COMM_WORLD, &stat); 

Используя функцию COUT, мне удалось обнаружить, что массив позиций перед отправкой является:

0 2 4 0 1055625616 32621 4252832 0 

Цифры после второй 0 являются массив пятна, которые я до сих пор не заполнены. Но массив позиции после RECV является:

-196000928 32767 -196001336 3 -1769860728 54 1047301632 32621 

Даже при изменении числа в массиве на мастер-процессор, ведомый всегда получает один и тот же массив.

Может ли кто-нибудь сказать мне, где я ошибаюсь, и как исправить эти массивы?

ответ

0

Ошибка указан в строке MPI_Send(&positions, SIZE, MPI_INT, r, 1, MPI::COMM_WORLD);. Вместо этого вы не должны использовать &positions, но positions. positions тип int * и поэтому &positions тип int **, и вы действительно просто отправляете мусор в этом случае вместо реального массива.

+0

Спасибо! Я действительно хочу отправить вам интернет-куки прямо сейчас. – user3262037

+0

Обратите внимание, что это относится только к аргументу 'position'' recursion() '. В основной функции 'position' и' & position' есть указатели, имеющие одинаковый адрес памяти, но имеющие разные типы, поэтому работает вызов 'MPI_Recv'. –

Смежные вопросы