6

C で書かれたプログラムから同時に異なるスレッドからARPACK固有値ソルバーを使用しても安全ですか? または、ARPACK 自体がスレッドセーフでない場合、API 互換のスレッドセーフな実装はありますか? Google で簡単に検索しても有用なものは何も見つかりませんでしたが、大規模な科学計算で ARPACK が頻繁に使用されているという事実を考えると、スレッドセーフなスパース固有値ソルバーを最初に必要とする人になるのは非常に驚くべきことです。

Fortran にあまり詳しくないので、ARPACK のソースコードを を使って C に翻訳したところ、f2cかなりの数の静的変数が存在するようです。基本的に、変換されたルーチン内のすべてのローカル変数は静的であるように見えます。これは、ライブラリ自体がスレッド セーフではないことを意味します。

4

4 に答える 4

4

を使用して ARPACK を C に変換しましたf2c。使用し、スレッドセーフに関心があるときはいつでも、スイッチf2cを使用する必要があります。-aこれにより、ローカル変数は自動的に格納されます。つまり、デフォルトスタティック変数ではなく、スタック ベースのローカル変数になります。

それでも、ARPACK 自体は明らかにスレッドセーフではありません。関数の異なる呼び出し間で状態を保持するために、多くの共通ブロック (つまり、グローバル変数) を使用します。メモリが機能する場合、開発者がグローバル変数を使用する傾向があるリバース通信インターフェイスを使用します。そしてもちろん、マルチスレッドが一般的になるずっと前に、おそらく ARPACK が作成されました。

最終的に、変換された C コードを再加工して、すべてのグローバル変数を体系的に削除しました。いくつかの C 構造体を作成し、グローバル変数をこれらの構造体に徐々に移動しました。最後に、これらの変数へのアクセスが必要な各関数に、これらの構造体へのポインターを渡しました。必要に応じて各グローバルをパラメーターに変換することもできましたが、構造体に含めてすべてをまとめた方がはるかにクリーンでした。

基本的には、グローバル変数をローカル変数に変換するという考え方です。

于 2011-08-07T11:19:23.683 に答える
4

Fortran 77 は再帰をサポートしていないため、標準準拠のコンパイラはすべての変数をプログラムのデータ セクションに割り当てることができます。原則として、スタックもヒープも必要ありません [1]。

これが f2c が行っていることである可能性があります。そうである場合、プログラム自体ではなく、プログラムを非スレッドセーフにする f2c ステップである可能性があります。もちろん、他の人が言及したように、COMMON ブロックもチェックしてください。編集処置: また、明示的なSAVEディレクティブを確認してください。SAVE は、C の static と同様に、後続のプロシージャの呼び出し間で変数の値を保持する必要があることを意味します。データ セクションにすべてのプロシージャ ローカル データを割り当てると、すべての変数が暗黙的に SAVE になります。 Fortran 標準では保証されていませんが、これを想定しているコードです。そのようなコードは、明らかにスレッドセーフではありません。に関して。特に ARPACK については、何も約束できませんが、一般的に ARPACK は高く評価されており、広く使用されているため、この種のダスティ デッキの問題が発生した場合は驚くでしょう。

最新の Fortran コンパイラのほとんどは、スタック割り当てを使用しています。たとえば、gfortran と -frecursive オプションを使用して ARPACK をコンパイルすると、うまくいくかもしれません。

編集

[1] より効率的だからではなく、Fortran はもともとスタックとヒープが発明される前に設計されたものであり、何らかの理由で、標準化委員会がスタックもヒープもサポートしないハードウェアに Fortran を実装するオプションを保持したかったためです。 Fortran 90. 実際、今日のキャッシュに大きく依存するハードウェアでは、データ セクション全体に分散しているプロシージャ ローカル データにアクセスするよりも、スタックの方が効率的であると思います。

于 2010-10-10T18:55:29.983 に答える
1

ARPACK は BLAC を使用していますよね?次に、これらのライブラリもスレッドセーフである必要があります。f2cでチェックするというあなたの考えは、Fortranコードがスレッドセーフかどうかを判断するための防弾方法ではないかもしれないと思います.Fortranコンパイラとライブラリにも依存すると思います.

于 2010-10-08T09:29:45.580 に答える
1

Fortran の翻訳で f2c がどのような戦略を使用しているかはわかりません。ARPACK は FORTRAN 77 で記述されているため、最初に行うことは、COMMON ブロックの存在を確認することです。これらはグローバル変数であり、使用された場合、コードはスレッド セーフではない可能性が高くなります。ARPACK の Web ページhttp://www.caam.rice.edu/software/ARPACK/には、並列バージョンがあると書かれています。そのバージョンはスレッドセーフである可能性が高いようです。

于 2010-10-08T13:04:44.070 に答える