Производительность Fortran, выделяйте при каждом вызове подпрограммы или объявляйте глобальную переменную и выделяйте один раз - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть подпрограмма, которая выделяет четыре вектора с размером = 9 и выполняет над ними некоторые операции. Эти векторы используются только внутри этой подпрограммы. Подпрограмма вызывается тысячи раз во время выполнения моей программы.

Стоит ли выделять векторы при каждом вызове подпрограммы или лучше создать глобальную переменную и распределить векторы только один раз?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Для очень больших рабочих массивов (больших 3D-массивов) я объявляю (глобальные) переменные модуля, а затем подхожу к процедуре очистки в модуле.

Однако для векторов размера 9 это действительно не обязательно. Размещение их в стеке в качестве локальных переменных ничего не стоит. Локальная переменная размера 9, будь то явная или автоматическая c, стоит ноль для размещения в стеке. Стандарт Fortran не позволяет вам решать, где происходит распределение, но обычно это делают компиляторы. И стек имеет тенденцию быть значением по умолчанию.

Stati c хранилище также возможно (эффективно принудительно атрибутом save), но кажется здесь ненужным.

0 голосов
/ 24 апреля 2020

Глобальные переменные в этом случае не рекомендуются по двум причинам:

  1. Эти переменные используются только в рамках отдельной подпрограммы, настройка глобальной переменной для этой цели очень плохая стиль кода
  2. Выделение глобальных переменных для заданных c операций плохо влияет на расширяемость вашего кода.

В этом случае родительская подпрограмма может помочь: Не определяйте векторы внутри глобальная область, но вместо этого установите родительскую подпрограмму, которая получает эти векторы в качестве аргументов, и пусть эта родительская подпрограмма вызывает соответствующие (подпрограммы) подпрограммы. Ваши векторы определены в пределах родительской подпрограммы, что означает, что родительская подпрограмма может передавать векторы подпрограммам (суб) без необходимости доступа к каким-либо глобальным ссылкам. Это сделает ваш код соответствующим стилю и (относительно) более эффективным по сравнению с перераспределением тех же векторов при каждом вызове подпрограммы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...