2016-12-22 4 views
0

Я хочу, чтобы рассеять ряд элементов в векторе типа структуры в течение ряда процессов с этим минимальным кодом(КОМП ++) MPI_Scatter производить неправильные результаты (логическая ошибка)

struct node 
{ 
    scale2 P; 
    scale2 V; 
    float M; 
    // 
    node(float M, float Px, float Py) // constructor 
    :P(Px,Py) 
    , V(0.f, 0.f) 
    , M(m) 
    {} 
}; 

основной функцией

int main(int argc, char **argv){ 
     std::vector<node> bodies; 
     std::vector<node> b; 
     int rank, size, ROOT =0; 
     long int pC; 


     MPI_Datatype MPI_NODE; 

     MPI_Init(&argc, &argv); 
     MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
     MPI_Comm_size(MPI_COMM_WORLD, &size); 

     //creating data type that represents node 
     //setup description of scale2 and float 
     // define and commit structure type 

     if(rank == ROOT){ 
      // initialise bodies 
      pC = bodies.size(); 
      cout <<pC << " nodes" << endl; 
     } 
     MPI_Bcast(&pC, 1, MPI_LONG, ROOT, MPI_COMM_WORLD); 

     MPI_Scatter(&bodies, pC/size, MPI_NODE, &b, pC/size, MPI_NODE, ROOT, MPI_COMM_WORLD); 
     cout << "rank "<<rank<<" has " <<b.size()<<" values of bodies"<<endl; 

     //other stuff 
     MPI_Finalize(); 
     return 0; 
    } 

выход Ищу (с 4-х процессов и размеров тел = 64)

rank 0 has 16 values of bodies 
rank 1 has 16 values of bodies 
rank 2 has 16 values of bodies 
rank 3 has 16 values of bodies 

выход я получаю

rank 0 has 64 values of bodies 
rank 2 has 2818 values of bodies 
rank 1 has 0 values of bodies 
rank 3 has 11311978710794943764 values of bodies 

Я уверен, что проблема заключается либо в MPI_Scatter линии или линии под ним, т.е. способ b.size() в настоящее время выводится в неправильном направлении. Я выдаю также может быть на пути vector<node> b передано в MPI_scatter Остальная часть кода работает отлично, так как я тестировал без этих двух строк. Если эта часть кода не является проблемой (в чем я сомневаюсь), то способ, которым я определяю тип данных MPI_NODE, неверен, и в этом случае я отредактирую свой код, чтобы показать эту часть.

ответ

0

С C++ вы не можете просто взять адрес std::vector, вы должны использовать .data(). Вы также должны зарезервировать достаточно места в recvbuf, что означает, что вы должны вручную указать b.resize(pC).

В вашем коде может быть больше проблем, пожалуйста, научитесь писать proper example code (не только минимальный, а также полный и поддающийся проверке!).

+0

pC транслируется в каждом ранге, не означает, что «инициализирует» его для каждого ранга? –

+0

, а также вы говорите, что я должен попробовать 'b.resize (pC/size)' вместо '& b' в' MPI_scatter() ' –

+0

Ooops, я упустил трансляцию - да, эта часть в порядке. Вы должны 'b.resize (pC/sisze);', а затем 'MPI_Scatter (.... b.data() ...);' – Zulan

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