Причина, по которой они отображаются в неправильном порядке, заключается в том, что серверная часть MPI собирает сообщения.Стандартный поток вывода всех дочерних процессов не связан напрямую с окном терминала, потому что это невозможно на нескольких компьютерах.
Вместо этого серверная часть MPI собирает все сообщения от каждого процесса.Затем он использует стандартные вызовы MPI для сбора этих сообщений в серверной части ранга 0. Именно в этой связи порядок сообщений перепутывается.
Обычно стандартный вывод не обрабатывается с приоритетом в процессе MPI, поэтому он не требует больших усилий для вывода вывода в правильном порядке.Обычно выходные данные хранятся в выходном буфере запущенного процесса.Вывод выводится только в том случае, если происходят следующие события (возможно, даже больше):
1) The end of the process
2) When there is a buffer over-flow (i.e. large amount of data is printed to the output)
3) flush is called on the output buffer (i.e. 'sys.stdout.flush()')
Таким образом, вы можете помочь себе, сбросив свой стандартный вывод при печати:
1) print('my message'); sys.stdout.flush()
2) print('my message on newer version of python', flush=True)
Однако вНа практике трудно заставить его работать должным образом.Если события сброса происходят для нескольких процессов MPI одновременно.Тогда несколько процессов будут отправлять сообщения с рангом 0. Таким образом, существует условие гонки, которое по существу определяет порядок, в котором вещи печатаются.Таким образом, чтобы привести вещи в правильный порядок, вам необходимо применить сочетание синхронизирующих и спящих вызовов, чтобы события сброса вызывались достаточно редко, чтобы избежать условий гонки.
Я подозреваю, что с вами происходитчто вывод сбрасывается только в конце процесса.Поскольку это происходит со всеми процессами одновременно, то вы видите результаты этой гонки коммуникации.
Надеюсь, это поможет.