Чтобы ответить на ваши 2 вопроса (в будущем лучше давать отдельные сообщения)
1) MPI_Barrier, BLACS_Barrier и любой барьер в любой методологии параллельного программирования, с которой я столкнулся, синхронизирует только фактический набор процессов это называет. Однако ввод-вывод обрабатывается не только вызывающим процессом, но по крайней мере одним, а вполне возможно, несколькими внутри ОС, которые фактически обрабатывают запрос ввода-вывода. Они НЕ синхронизируются вашим барьером. Таким образом, упорядочение ввода-вывода не обеспечивается простым барьером. Единственные стандартные соответствующие способы, которые я могу придумать для обеспечения упорядочения ввода-вывода:
- Сделать все операции ввода-вывода одним процессом или
- Лучше использовать MPI I / O прямо или косвенно, например, через NetCDF или HDF5
2) Ваш второй вызов BLACS_GRIDINIT
call BLACS_GRIDINIT(ctxt, 'c', 3, 2)
создает контекст для сетки процессов 3 на 2, поэтому удерживая 6 обработать. Если вы вызываете его с более чем 6 процессами, только 6 будут возвращены с допустимым контекстом, для остальных ctxt
следует рассматривать как неинициализированное значение. Так, например, если вы вызываете его с 8 процессами, 6 вернутся с действительным ctxt
, 2 вернутся с ctxt
, не имеющим действительного значения. Если эти 2 теперь попытаются использовать ctxt
, все будет возможно, и в вашем случае вы получите ошибку seg. Вы, кажется, видите, что это проблема, поскольку позже у вас будет
! all processes not belonging to 'ctxt' jump to the end of the program
if (ctxt .lt. 0) goto 1000
, но я не вижу ничего в описании BLACS_GRIDINIT, которое гарантирует, что ctxt будет меньше нуля для неучаствующих процессов - на https://www.netlib.org/blacs/BLACS/QRef.html#BLACS_GRIDINIT он говорит
Эта процедура создает простую сетку процессов NPROW x NPCOL. Эта сетка процессов будет использовать первые процессы NPROW x NPCOL и назначать их сетке в естественном порядке по строкам или столбцам. Если эти сопоставления процесса с сеткой неприемлемы, вместо этого должна быть вызвана более сложная сестринская подпрограмма BLACS_GRIDINIT BLACS_GRIDMAP. результирующая сетка - это проблема, которую я регулярно нахожу в документации BLACS. Также, пожалуйста, не используйте goto
ради вас самих. Вы потом пожалеете об этом. Используйте If ... End If
. Я не могу вспомнить, когда я в последний раз использовал goto
в Фортране, это может быть более 10 лет go.
Наконец, удачи в использовании BLACS! По моему опыту, документация часто бывает неполной, и я бы предложил использовать только те вызовы, которые абсолютно необходимы для использования ScaLAPACK, и MPI, который гораздо лучше определен для остальных. Было бы намного лучше, если бы ScaLAPACK в наши дни просто работал с MPI.