私はいくつかの線形代数コードを書いています(Fortran 2003ではFortran 90やCで同じ問題になります)。計算にはいくつかの作業ベクトルが必要です。これに対処する私の考えは、配列w(:,:)
は、線形代数モジュールに対してプライベートです。すなわち、なぜ真のグローバル変数がひどいのかをthis discussionで定義された「隠されたグローバル」です。は、隠されたグローバルな悪いプログラミング練習ですか?
私はこれを黒板で解くのに大きな問題があると想像し、問題の各部分については黒板の領域を選んで解決します。
このようにして、小さなホワイトボードがたくさんある場合もあります。work_array
データ型を定義し、必要に応じてソルバーに渡します。 (PETScは、このアプローチを別の抽象レイヤーで効果的に使用します; solver
は、使用されるメソッドへのいくつかの手続きポインターといくつかの作業ベクトルを含むデータ型です)。あるソルバーから他のソルバーにネストされた呼び出しがある場合、複雑なダニなので、私は最初の方法がより好きです。また、間違った指示を必要としません。
どのアプローチを使用してプログラミングを改善するかについての考えはありますか?
EDIT:このコードの古い化身ですでに行っているOpenMPの使用を開始すると、問題になるとは思われません。各スレッドは、問題が設定された後、未知の部分だけにアクセスし、他のスレッドの部分にはアクセスしません。それにもかかわらず、並行性の問題はおそらく静的変数を一般的に使用しないのに十分な理由です。
ソルバーを呼び出すたびにスクラッチアレイの領域を動的に割り当てておく必要がある場合は、オーバーヘッドが大きくなることはありませんか?
複数のスレッドが一度にアクセスしようとするとどうなりますか? – Mysticial
どのような利点がありますか?作業スペースが小さい場合は、自動化してください。それが巨大であれば、mallocと必要に応じて無料です。 –