Когда я звоню:
MPI_File_open(k_space_communicator, "TB_schro_BS.dat", MPI_MODE_CREATE|MPI_MODE_WRONLY,MPI_INFO_NULL, &bs_out); MPI_File_close(&bs_out);
k_space_communicator
работает, как это используется во многих других функциях без проблем,
bs_out
объявлено: MPI_File bs_out;
TB_schro_BS.dat
это файл, который был удален перед этим вызовом, если он уже существует.
Я не получаю немедленных ошибок или зависаний (все процессы делают это из этой функции), и код, кажется, прекрасно работает до тех пор, пока позже в программе, он случайно зависает, когда я пытаюсь удалить другой объект.
Итак, это происходит только тогда, когда у меня есть ряд процессов, которые не являются фактором количества вычислений, которые я делаю. Однако, если я закомментирую эту строку кода, никаких зависаний не будет, независимо от того, сколько процессов я выполняю (очевидно, меньше, чем вычисления).
Самое странное в том, что когда я проследил, где происходят зависания, я обнаружил, что это происходит между концом деструктора объекта и сразу после вызова удаления объекта, где нет дополнительного кода.
Наконец, есть одна ошибка, которая выводится перед зависанием, которую я не мог полностью расшифровать, и возникает между 1-3 раза за запуск для запуска из 4 процессов:
*** glibc detected *** mpiuf-nemo: corrupted double-linked list: 0x000000000192a640 ***
Я работаю в cpp
с помощью mpich2
на Ubuntu. Извините, я не могу быть более конкретным, так как не могу сообщить подробности о коде, но я буду рад ответить на любые ваши дополнительные вопросы. Извините, если я что-то пропустил. Я немного взволнован этой проблемой.
Вы должны выяснить, возможно, с помощью valgrind, откуда возникла эта glibc-обнаруженная ошибка о двойном списке.
Вы упомянули создание / уничтожение объектов, но в вашем примере используются привязки Си. Вы смешиваете привязки C и C ++? Большая часть кода C ++ прекрасно использует привязки C.
Других решений пока нет …