2013-04-28 2 views
0

Я новичок, когда дело доходит до MPI, но это не имеет смысла. Таким образом, у меня есть отладочный код здесь, который использует MPI_Recv и MPI_Send, но сразу после того, как я сказал мне свой размер ячейки, вещь замораживается до первого «я сделал это здесь». отправляется на экран.Почему мой код на C++ MPI замерзает на мне?

Я не понимаю, почему. Между первым «я сделал это здесь» буквально ничего не произошло, и последнее, что выводилось на экран.

Вот надрез кода

void initMesh(double* &phi, double &h, double &riptime, 
    double &deltat, int &x, int &y, int &xlength, int &ylength, int &tlength, int &ttasks, int &jtasks, int &itasks, int &tstart, int &jstart, int &istart, int &myrank, int &cores) { 
    int tasksize, remains, tremains; 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    MPI_Comm_size(MPI_COMM_WORLD, &cores); 
     if (myrank == 0) { 
     cout << "How large would you like the mesh" 
     <<" to be in the x-direction?" << endl; 
     cin >> x; 
     cout << "How large would you like the mesh" 
     << " to be in the y-direction?\n"; 
     cin >> y; 
     cout << "What is the distance between each x/y spot h (equal distance)?\n"; 
     cin >> h; 
     cout << "How much time would you like the program to run for?\n"; 
     cin >> riptime; 
     cout << "What would you like the time-step for the analysis to be?\n"; 
     cin >> deltat; 
     xlength = (int) (x/h); 
     ylength = (int) (y/h); 
     tlength = (int) (riptime/deltat); 
     cout << "Mesh x-points = " << xlength << endl; 
     cout << "Mesh y-points = " << ylength << endl; 
     cout << "Mesh time points = " << tlength << endl; 
     cout << "I made it here!"; 
     } 

//GOOD UP TO HERE!!! Then it freezes when I run the thing with 3 or more processors 


     for (int i=1; i < cores; i++) { 
      if (myrank==0) { 
      cout << "I made it here!"; 
      MPI_Send(&xlength, 1, MPI_INT, i, 0, MPI_COMM_WORLD); 
      } 
      else { 
      MPI_Recv(&xlength, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
      cout << "I made it here!"; 
      } 
     } 
     for (int i=1; i < cores; i++) { 
      if (myrank==0) { 
      MPI_Send(&ylength, 1, MPI_INT, i, 1, MPI_COMM_WORLD); 
      } 
      else { 
      MPI_Recv(&ylength, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
      } 
     } 
     for (int i=1; i < cores; i++) { 
      if (myrank==0) { 
      MPI_Send(&tlength, 1, MPI_INT, i, 2, MPI_COMM_WORLD); 
      } 
      else { 
      MPI_Recv(&tlength, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
      } 
     } 
    cout << "I made it here!"; 

выше часть кода, где проблема сейчас.

+0

Первый '' я сделал это здесь! ''Буферизуется (нет' std :: endl' для флеша). Что произойдет, если вы это исправите? – chrisaycock

+0

Прости, что я новичок в этом. Что вы подразумеваете под std :: endl для flush? Я заметил, что когда у меня были части с (int), он сказал, что он делит на ноль после того, как я спрятал остальную часть кода. – Mechy

+0

Попробуйте использовать 'cerr' вместо всего' cout' и поместите '<< std :: endl;' в конец строки. Это позволит убедиться, что ваш вывод не буферизирован, а напрямую записан на экран. @chrisaycock подозревает, что тот факт, что последняя строка не печатается, - это просто вопрос буферизации, а не потому, что программа выходит из строя до строки, в которой генерируется вывод. –

ответ

2

Как указано в комментариях, вы не видите "I made it here!", потому что вам не хватает << endl.

Что касается MPI: в каждом для цикла, ранг 0, кажется, посылает что-то в любой ранг. Однако каждый другой ранг рассчитывает получить одно сообщение за каждую итерацию цикла. Вы хотите, чтобы каждый ранг получал только один за цикл.

На самом деле, так как вы отправляете ту же информацию на каждый ранг есть два еще лучше альтернатив:

  • Если предположить, что каждый ранг имеет тот же рутину входа, вычислить x -, y - и tlength избыточности на каждый процесс (путь быстрее, чем передача его).
  • Если это не вариант, используйте MPI_Broadcast с рангом 0 в качестве источника.
+0

Это очень помогает вам. Я попробую это и посмотрю, что произойдет. – Mechy

+0

Исправлена ​​проблема, спасибо! – Mechy