2016-12-09 7 views
1

Я запускаю программу 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 
+1

Неопределенное поведение может принимать различные формы, это будет трудно сказать без другого кода. – Zulan

+0

«Другой код» - очень большая программа, поэтому невозможно прочитать все это и искать недопустимую ошибку чтения/записи. Мой вопрос в основном связан с общей стратегией поиска таких ошибок при использовании MPI. Я нашел решение (см. Ниже), используя Valgrind. Если есть другие потенциальные причины для этих типов проблем MPI (и решения), было бы интересно услышать о них. –

ответ

1

Я нашел решение. Как подозревали, проблема была в коррупции памяти.

Я совершил ошибку начинающего при запуске Valgrind с MPI. Я побежал:

valgrind <options> mpirun -np 2 <programname> 

вместо

mpirun -np 2 valgrind <options> <programname> 

Таким образом, я бегу Valgrind на "mpirun" само по себе, а не на намеченной программе. Когда я правильно запустил Valgrind, он обнаружил повреждение памяти в несвязанной части кода.

Престижность другой переполнением стека Q/A за помощь мне понять это: Using valgrind to spot error in mpi code

+0

Молодцы. Вы можете принять свой собственный ответ, отметив галочку слева. –