Я новичок, когда дело доходит до 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!";
выше часть кода, где проблема сейчас.
Первый '' я сделал это здесь! ''Буферизуется (нет' std :: endl' для флеша). Что произойдет, если вы это исправите? – chrisaycock
Прости, что я новичок в этом. Что вы подразумеваете под std :: endl для flush? Я заметил, что когда у меня были части с (int), он сказал, что он делит на ноль после того, как я спрятал остальную часть кода. – Mechy
Попробуйте использовать 'cerr' вместо всего' cout' и поместите '<< std :: endl;' в конец строки. Это позволит убедиться, что ваш вывод не буферизирован, а напрямую записан на экран. @chrisaycock подозревает, что тот факт, что последняя строка не печатается, - это просто вопрос буферизации, а не потому, что программа выходит из строя до строки, в которой генерируется вывод. –