Моя программа - это просто процедура диагонализации гамильтониана определенной системы.Я пытаюсь работать с очень большой системой, которая очень сложна в вычислительном отношении.Фактически, если я увеличу размер системы на одну единицу, он превысит максимальный размер, который LAPACK может раскосить.(Примечание: не масштабируется линейно с количеством единиц).
В настоящее время я пытаюсь получить результат с очень высоким разрешением, что означает, что мне нужно усреднить вычисление примерно 10000 раз.Если бы я должен был сохранить серийный код, это заняло бы около 300 часов, поэтому я распараллелил свою программу.
Я настроил ее так, чтобы я выполнял 1000 вычислений на 10 разных ядрах и объединял их в конце,Я делал это довольно давно, поэтому не верю, что это проблема.
Моя проблема в том, что в моем коде есть ошибка, из-за которой программа зависает.К сожалению, это происходит только на одном из моих десяти процессоров, каждый из которых выполняет 1000 вычислений.Это может быть так редко, как 1 на 10000 запусков (очень специфический сценарий).
Я знаю, что он застревает, потому что внутри моей программы есть вызов MPI_reduce.Кроме того, я вывожу на экран прогресс каждого процесса (каждые 10% выполнения).Я могу определить, что мой мастер-процесс не может продолжаться после MPI_reduce, потому что один из остальных 10 процессов вышел из строя (но не остановлен).Я легко могу определить, какой процесс не удался.
У меня нет времени, чтобы найти и исправить ошибку, поэтому я ищу следующее:
Это плохая практика, чтобы делать реальные расчеты на моем мастер-процессе?Или же мой основной процесс должен быть оставлен для общения и выполнения вычислений в конце.
Как отменить процесс (чтобы мой основной процесс мог продолжиться после MPI_reduce) изнутри программы?
Проблема с 2: Мой мастер-процесс не может прочитать дополнительные строки, пока он ожидает, пока другие процессы достигнут команды mpi_reduce.
Я программирую на Фортране, используя OpenMPI и компилятор mpifort.