Существует mpi-версия программы, которая использует блоки COMMON для хранения массивов, которые повсеместно используются в коде. К сожалению, нет способа объявить массивы в ОБЩЕМ блоке, размер которого будет известен только во время выполнения. Итак, в качестве обходного пути я решил переместить эти массивы в модули, которые принимают ALLOCATABLE массивы внутри. То есть все массивы в ОБЩИХ блоках исчезли, вместо этого использовался ALLOCATE. Так что это было единственное, что я изменил в своей программе. К сожалению, производительность программы была ужасной (по сравнению с реализацией ОБЩИХ блоков). Что касается mpi-настроек, то на каждом вычислительном узле есть один mpi-процесс, и каждый mpi-процесс имеет один поток.
Я нашел похожий вопрос, заданный здесь, но не думаю (не понимаю :)), как его можно применить к моему случаю (где каждый процесс имеет одну нить). Я ценю любую помощь.
Вот простой пример, который иллюстрирует то, о чем я говорил (ниже псевдокод):
"ИСТОЧНИК ФАЙЛ":
SUBROUTINE ZEROSET()
INCLUDE 'FILE_1.INC'
INCLUDE 'FILE_2.INC'
INCLUDE 'FILE_3.INC'
....
INCLUDE 'FILE_N.INC'
ARRAY_1 = 0.0
ARRAY_2 = 0.0
ARRAY_3 = 0.0
ARRAY_4 = 0.0
...
ARRAY_N = 0.0
END SUBROUTINE
Как вы можете видеть, ZEROSET () не имеет параллельных или MPI-компонентов. FILE_1.INC, FILE_2, ..., FILE_N.INC - это файлы, в которых ARRAY_1, ARRAY_2 ... ARRAY_N определены в блоках COMMON. Нечто подобное
REAL ARRAY_1
COMMON /ARRAY_1/ ARRAY_1(NX, NY, NZ)
Где NX, NY, NZ - это четко определенные параметры, описанные с помощью директивы PARAMETER.
Когда я использую модули, я просто уничтожил все ОБЩИЕ блоки, поэтому FILE_I.INC выглядит как
REAL, ALLOCATABLE:: ARRAY_I(:,:,:)
А затем просто изменил приведенный выше оператор "INCLUDE 'FILE_I.INC" на "USE FILE_I". На самом деле, когда выполняется параллельная программа, одному конкретному процессу не требуется целый домен (NX, NY, NZ), поэтому я вычисляю параметры и затем выделяю ARRAY_I (только ОДИН РАЗ!).
Подпрограмма ZEROSET () выполняется 0,18 секунды с блоками COMMON и 0,36 с модулями (когда размеры массива вычисляются во время выполнения). Итак, производительность ухудшалась в два раза.
Я надеюсь, что теперь все ясно. Я очень ценю вашу помощь.