私はいくつかの線形代数コードを書いています(Fortran 2003では、Fortran 90またはCでも同じ問題です)。これには、計算を行うためにいくつかの作業ベクトルが必要です。これを処理するための私のアイデアは、次のような作業配列を作成することですw(:,:)
。は線形代数モジュール専用です。つまり、真のグローバル変数がひどい理由についてのこの説明で定義されている「隠しグローバル」です。
これは黒板で解決すべき大きな問題があると想像します。問題の各部分について、黒板の領域を選択して解決します。
そのアナロジーに沿って、私はたくさんの小さなホワイトボードを持つこともできます。work_array
データ型を定義し、必要に応じてそれらをソルバーに渡します。(PETScは、抽象化の別のレイヤーを通じてこのアプローチを効果的に使用します。asolver
は、使用されるメソッドへのいくつかのプロシージャポインターと、いくつかの作業ベクトルを含むデータ型です。)1つのソルバーから別のソルバーへのネストされた呼び出しがある場合、これはダニは複雑なので、最初の方法の方が好きです。また、それほど多くの誤った方向性を必要としません。
どのアプローチがより良いプログラミングの練習に役立つかについて何か考えはありますか?
編集:OpenMPを使い始めたときにも問題になるとは思いません。これは、このコードの古い形ですでに行っています。問題が設定された後、各スレッドは未知の部分にのみアクセスし、他のスレッドの部分にはアクセスしません。それでも、並行性の問題は、静的変数を一般的に使用しない理由としておそらく適切です。
ソルバーを呼び出すたびにスクラッチ配列に動的にスペースを割り当て続ける必要がある場合、これは多くの場合、多くのオーバーヘッドが発生しませんか?