Управление памятью массива Fortran

Я работаю над оптимизацией программы анализа потока жидкости и теплопередачи, написанной на Fortran. Когда я пытаюсь запускать все большие и большие симуляции сетки, я сталкиваюсь с проблемами ограничения памяти. Сетка, однако, не такая уж большая. Только 500,000 клеток и мелкий арахис для типичного кода CFD для запуска. Даже когда я запрашиваю 80 ГБ памяти для моей проблемы, это сбой из-за недостаточной виртуальной памяти.

У меня есть несколько догадок о том, какие массивы забивают все это память. Один в частности выделяется (28801,345600). Поправьте меня, если я ошибаюсь в своих расчетах, но двойной прецизионный массив составляет 8 бит на значение. Таким образом, размер этого массива будет 28801*345600*8=79,6 ГБ?

теперь я думаю, что большая часть этого массива заканчивается нулями на протяжении всего вычисления, поэтому нам не нужно их хранить. Я думаю, что могу изменить алгоритм решения, чтобы хранить ненулевые значения для работы в гораздо меньшем массиве. Тем не менее, я хочу быть уверен что я смотрю на правильные массивы, чтобы уменьшить размер. Итак, во-первых, правильно ли я рассчитал размер массива выше? И во-вторых, есть ли способ показать размеры массива Fortran в Мб или ГБ во время выполнения? Помимо печати наиболее интенсивных массивов памяти, мне было бы интересно посмотреть, как требования к памяти кода меняются во время выполнения.

1 ответов


использование памяти-довольно неопределенное понятие в системах с виртуальной памятью. У вас может быть большой объем выделенной памяти (large размер виртуальной памяти), но только небольшая часть его фактически активно используется (маленький резидентов установлена в размере - RSS).

системы Unix обеспечивают getrusage(2) системный вызов, который возвращает информацию о количестве системных ресурсов, используемых вызывающим потоком/процессом / дочерними процессами. В частности, это предоставляет значение maxmimum RSS, когда-либо достигнутое с момента запуска процесса. Вы можете написать простую функцию Fortran callable helper C, которая будет вызывать getrusage(2) и возвращает значение ru_maxrss поле в rusage структура.

если вы работаете на Linux и не заботитесь о переносимости, то вы можете просто открыть и прочитать из /proc/self/status. Это простой текстовый псевдофайл, который помимо прочего содержит несколько строк со статистикой о процессе виртуальной памяти использование:

...
VmPeak:     9136 kB
VmSize:     7896 kB
VmLck:         0 kB
VmHWM:      7572 kB
VmRSS:      6316 kB
VmData:     5224 kB
VmStk:        88 kB
VmExe:       572 kB
VmLib:      1708 kB
VmPTE:        20 kB
...

объяснение различных областях - здесь. Вас интересует, как VmData, VmRSS, VmHWM и VmSize. Вы можете открыть /proc/self/status как обычный файл с OPEN() и обработайте его полностью в своем коде Fortran.

Смотрите также, какие ограничения памяти установлены с ulimit -a и ulimit -aH. Вы можете превысить ограничение размера виртуальной памяти hard. Если вы отправляете задания через распределенный менеджер ресурсов (например, SGE/OGE, Вращающий момент / PBS, LSF, etc.) убедитесь, что вы запросили достаточно памяти для работы.