Я запускаю программу MPI C++ локально с двумя процессами: mpirun -np 2 <programname>
. Я вижу непоследовательное поведение команды MPI_Gather. Чтобы проверить, я написал очень короткий фрагмент кода. Я скопировал код в начало main, и он работал нормально. Но при копировании его в другие пункты кода он иногда дает правильный результат, а иногда и нет. Ниже приведен фрагмент кода. Я сомневаюсь, что проблема связана с самим фрагментом кода (поскольку он иногда работает правильно). Как правило, когда я вижу противоречивое поведение кода, подобное этому, я подозреваю, что повреждение памяти. Тем не менее, я запустил Valgrind в этом случае, и он ничего не сообщал об ошибке (хотя, возможно, я не правильно использую Valgrind для MPI - я не испытываю использования Valgrind в программах MPI). Что может быть причиной такого непоследовательного поведения и что я могу сделать, чтобы обнаружить проблему?Непоследовательное поведение от MPI_Gather
Это фрагмент кода.
double val[2] = {0, 1};
val[0] += 10.0*double(gmpirank);
val[1] += 10.0*double(gmpirank);
double recv[4];
printdebug("send", val[0],val[1]);
int err = MPI_Gather(val,2,MPI_DOUBLE,recv,2,MPI_DOUBLE,0,MPI_COMM_WORLD);
if (gmpirank == 0) {
printdebug("recv");
printdebug(recv[0],recv[1]);
printdebug(recv[2],recv[3]);
}
printdebug("finished test", err);
Печатающая отладки функция печатает в файл, который является отдельным для каждого процесса, и отделяет входные аргументы с запятой.
Процесс 1 печатает:
send, 10, 11
finished test, 0
Иногда процесс 0 напечатает:
send, 0, 1
recv
0, 1
10, 11
finished test, 0
Но когда я разместить код в других разделах кода, процесса-иногда печатают что-то вроде этого:
send, 0, 1
recv
0, 1
2.9643938750474793e-322, 0
finished test, 0
Неопределенное поведение может принимать различные формы, это будет трудно сказать без другого кода. – Zulan
«Другой код» - очень большая программа, поэтому невозможно прочитать все это и искать недопустимую ошибку чтения/записи. Мой вопрос в основном связан с общей стратегией поиска таких ошибок при использовании MPI. Я нашел решение (см. Ниже), используя Valgrind. Если есть другие потенциальные причины для этих типов проблем MPI (и решения), было бы интересно услышать о них. –