Я пишу код линейной алгебры (в Fortran 2003, но это была бы такая же проблема в Fortran 90 или C), которая требует нескольких векторов работы для выполнения вычислений. Моя идея для решения этой задачи - сделать работу array w(:,:)
, который является частным для модуля линейной алгебры, то есть «скрытого глобального», как определено в this discussion, почему истинные глобальные переменные ужасны.скрыты глобалы плохой практики программирования?
Я представляю, что это как большая проблема для решения на доске, и для каждой части проблемы вы выбираете область доски, чтобы решить ее.
В соответствии с этой аналогией я мог бы также иметь кучу маленьких досок: определить тип данных work_array
и передать их решателям по мере необходимости. (PETSc эффективно использует этот подход через другой уровень абстракции: solver
- это тип данных, который включает в себя некоторые указатели на методы, используемые как и несколько рабочих векторов.) Когда есть вложенные вызовы от одного решателя к другому, это получает клещ сложный, поэтому мне нравится первый способ лучше. Это также не требует такого же неправильного направления.
Любые мысли о том, какой подход способствует лучшей практике программирования?
EDIT: Я также не думаю, что это будет проблемой, когда я начну использовать OpenMP, который я уже сделал в старом воплощении этого кода. Каждый поток получает доступ к своей части неизвестных, а не к другим темам после установки проблемы. Тем не менее, проблемы параллелизма, вероятно, являются хорошей причиной не использовать статические переменные в целом.
Если мне приходится динамически выделять пространство для массивов царапин каждый раз, когда я звоню в решатель, который часто не будет налагать много накладных расходов?
Что делать, если несколько потоков пытались получить к нему доступ сразу? – Mysticial
Какая польза? Если рабочее пространство мало, сделайте его автоматическим. Если он огромный, malloc и бесплатно по мере необходимости. –