Ни MPI_Barrier, ни BLACS_Barrier не останавливают процессоры, выполняющие его команды. - PullRequest
0 голосов
/ 08 мая 2020
• 1000 нет глубокого понимания того, как это работает внутри и т. д.

В любом случае, я пытаюсь передать привет с помощью подпрограммы BLACS, следуя коду. 10 ./exe 'похож на

 hello from process           0           0           0           3           2
 hello from process           4           1           1           3           2
 hello from process           1           1           0           3           2
                           myid       myrow       mycol       nprow       npcol
 hello from process           5           2           1           3           2
 hello from process           2           2           0           3           2
 hello from process           3           0           1           3           2

Кажется, все работает нормально, за исключением строки «BLACS_BARRIER», которую я пометил (**) слева от кода.

Я поместите эту строку, чтобы получить результат, как показано ниже, чья строка заголовка всегда печатается в верхней части.

                           myid       myrow       mycol       nprow       npcol
 hello from process           0           0           0           3           2
 hello from process           4           1           1           3           2
 hello from process           1           1           0           3           2
 hello from process           5           2           1           3           2
 hello from process           2           2           0           3           2
 hello from process           3           0           1           3           2

Итак, вопрос следующий:

  1. Я попробовал BLACS_BARRIER для 'ctxt_sys', 'ctxt_all' и 'ctxt', но все они не делают вывод, в котором сначала печатается строка заголовка. Я также пробовал MPI_Barrier (MPI_COMM_WORLD, info), но это тоже не сработало. Неправильно ли я использую барьеры?

  2. Вдобавок я получил сигнал SIGSEGV, когда использовал BLACS_BARRIER для ctxt и использовал более 6 процессов при выполнении mpirun. Почему в этом случае имеет место SIGSEGV?

Спасибо, что прочитали этот вопрос.

1 Ответ

1 голос
/ 09 мая 2020

Чтобы ответить на ваши 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.

...