問題タブ [fortran-common-block]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - マルチスレッド C++ アプリケーションの Fortran 77 共通ブロック
Fortran 77 ルーチンを呼び出す C++ プログラムを 1 つ開発しています。メインの C++ プログラムはマルチスレッドで実行できます。ただし、Fortran 77 ルーチンは、引数に応じて各呼び出しで変更されるいくつかの共通ブロックを非表示にすることがあります。
すべての共通ブロックが複数のスレッド間で共有される可能性があり、これらのブロックへの同時アクセスがおそらくすべてを混乱させるのではないかと心配しています。
最初の質問: 私は正しいですか? 共通ブロックは複数のスレッド間で共有されますか?
2 番目の質問: それを回避する簡単な方法はありますか? Fortran ルーチンを書き直すのは手が届かないように思えます。むしろ、各スレッドがすべての共通ブロックの独自のコピーを持つようにする方法を探しています (サイズが大きくなく、コピーが高速である必要があります)。コンパイル オプションが役立つかどうか、または OpenMP が役立つかどうかはわかりません。
parallel-processing - OpenMP 並列プログラミングにおける共通ブロックの問題
Fortran での並列プログラミングでの共通ブロックの使用についていくつか質問があります。
サブルーチンには共通ブロックがあります。並列 do 領域ですべての共通ブロックと threadprivate を宣言する必要がありますか?
彼らはどのように情報を渡しますか? 各スレッドに個別の共通クロックが必要で、並列領域の最後まで情報を渡すようにします。ここで起こりますか?
私の
/li>Ford
サブルーチンは共通ブロックのいくつかの変数を変更し、Condact
サブルーチンはそれらを再度上書きしますが、関数はCondact
サブルーチンからの値を使用します。2 番目のサブルーチンと関数は、各スレッドの前のサブルーチンから変数をコピーしますか?
c++ - C++ が Fortran 77 の共通ブロックを呼び出す方法
私はプログラミングを始めたばかりで、C++ コードで Fortran 77 共通ブロックを呼び出したいと考えています。実際、私のようなQ&Aをいくつか読んだことがありますが、あまり明確ではありませんでした....
この共通ブロックは、別の Fortran 77 サブルーチンによって定義されます。
サンプルコードは次のとおりです。
株式会社コモン:
tstfunc.f
tst01.cpp
delta
(common.inc から) C++ 関数に渡したい場合printmtrx()
、どうすればよいですか?
fortran - 行列の初期化 - 重複を避けるには?
私は、大部分が1を保持する21x21の行列を持っています。特定の要素は、個別の数値で初期化する必要があります。既存のソリューションは 2 段階の初期化です。最初にすべての要素を 1 に設定し、次に選択した要素を個別の数値に再割り当てします。
これは従来の FORTRAN77 コードで実装されています。以下を参照してください。また、gfortran-4.9で適切にコンパイルされます(警告なしでも)。
ただし、 gfortran-4.4を実行している古いサーバーでコンパイルする必要があります。f2cやg95コンパイラなどの代替ツールを使用すると、「初期化の重複」が原因で失敗します。
では、特殊な BLOCK DATA プログラム単位でこのオーバーラップを回避するという問題をどのように再コーディングできますか? また、インテル Fortran コンパイラでは可能ですが、初期化の順序が保証されないため、お勧めできません。
fortran - COMMON ブロック共有変数
2 つのサブルーチンがあるとします。
COMMON ブロックは変数を共有するために使用されます。これは、サブルーチンで更新される の値がサブルーチンと同じになることを意味X
しY
ますS2909
かS2900
?
variables - 共通のブロックとサブルーチンの引数
var
という名前の共通ブロックにある変数が呼び出されたmyCB
場合、同じ名前を使用して、共通ブロックを使用していない他の 2 つのサブルーチン間で引数を渡すことができますmyCB
か?
コードは以下のようなものです。
とVar
の間の受け渡しに問題がSR1
ありますが、問題は共通ブロックで指定されSR2
た他の名前に由来する可能性がありますか?Var
fortran - OpenMP プライベート共通ブロック変数を宣言する方法は?
私は並列コンピューティングが初めてで、OpenMP を使用して、以前に取り組んだ逐次 Fortran プログラムを並列化しようとしています。私のメイン コードは次の例のようになります。
$OMP PARALLEL DO を使用しようとしていますが、グローバルに宣言され、関数「test」で使用される変数「y」に問題がありますが、各スレッド内で変更されます。関数「test」の引数として「y」を宣言せずに、このようなコードを並列化するにはどうすればよいですか?
また、各スレッドが反復カウンター「i」の値をプログラム全体(関数を含む)でプライベートに運ぶ方法はありますか?
windows - 共有ライブラリ内の名前付き共通ブロック
共有ライブラリに Fortran サブルーチンを含めると、問題が発生します。このサブルーチンには、名前付き共通ブロックがあります。
この共通ブロックを使用し、共有ライブラリとリンクする Fortran メイン プログラムがあります。
この動作は、サブルーチンまたはメイン プログラムのいずれかで設定された共通ブロック内の変数が 2 つの間で共有されないというものです。
WindowsのMinGWでgfortran 4.9.3を使用しています。これが私の非常に単純な例の一部です。
メインプログラム:
サブルーチン:
メイクファイル:
mainp.exe
を実行するとivar = 0
、正しいのではなく、ivar=23
次のようになりますnm
。
これは、_whgc_
mainp.exe の唯一のシンボルです。
ただし、mainp.exe
gdb で実行し、 と の両方にブレーク ポイントを設定する
mainp
と、各ブレーク ポイントでsharedf
のアドレスを出力できます。ivar
アドレスが同じではありません。
動作から、GNU ld がシンボルと正しく一致していないことは明らか_whgc_
ですが、共有ライブラリのビルドまたは最終的なリンクでどのオプションを渡せばよいかわかりません。
(共通ブロックの代替案を提案しないでください。私の実際のアプリケーションでは、共通ブロックを使用するレガシー コードを扱っています。)
編集:
Linux/x86 で私の例を試してみましたが、動作は正しいです。もちろん、Linux では共有ライブラリと実行可能ファイルは ELF 形式のオブジェクトであり、Windows/MinGW では形式は PE/COFF です。