1

Matlab 内から実行されている Fortran アプリケーションからの出力に問題があります。Matlab を使用して、多数の Fortran アプリケーションを呼び出し、出力と結果を表示します。

OSX で gfortran を使用して、これらのプログラムの 1 つを構築しています。このプログラムは、大量のファイル出力と stdout への少量の出力を行って進行状況を追跡します。stdout 出力は、主に print * ステートメントを使用して行われますが、write( * , * ) も試しました。プログラムは OpenMP を使用しますが、print * または write( * , * ) ステートメントは OpenMP 並列セクション内で実行されません。プログラムを端末から実行すると、すべて正常に動作します。ただし、プログラムが matlab 内から実行される場合、stdout からの出力はありません。ただし、ファイル出力は正常に機能します。

さらに、同じコードを Intel の ifort でコンパイルすると、その出力が問題なく matlab に表示されます。残念ながら、Intel コンパイラに定期的にアクセスすることはできません。

出力が stdout (stderr ではない) に出力されることは確信しており、コード内から両方をフラッシュしようとしました (flush(6) を呼び出し、flush(0) を呼び出します)。違い。

何が原因なのかわかりません。何かご意見は?

関連情報: OS: OSX 10.6.8 (64ビットモード)

マトラブ: R2012b

gfortran: 4.7.2 (fink 経由で取得)

コンパイル フラグ: -cpp -fopenmp -ffree-line-length-0 -fno-range-check -m64 -static-libgfortran -fconvert=little-endian -fstrict-aliasing

編集:

簡単な「hello」プログラムを作成して、さらにテストを行いました。

program printTest
write (*,*) 'hello'
end program

でコンパイル...

gfortran test.f90 -o test

これは同じ動作を示します。

また、以前のバージョンの gfortran (4.2.1) でコンパイルしてみましたが、興味深い結果が得られました。ターミナルでは正常に実行されますが、matlab では次のようになります。

!./test dyld: 遅延シンボル バインドに失敗しました: シンボルが見つかりません: __gfortran_set_std 参照元: /Users/sah/Desktop/./test

dyld: シンボルが見つかりません: __gfortran_set_std 参照元: /Users/sah/Desktop/./test 予期される場所: /Applications/MATLAB_R2012b.app/sys/os/maci64/libgfortran.2.dylib

./test: トレース/ブレークポイント トラップ

これは、ライブラリの問題であると私に信じさせます。この場合、-static-libgfortran を使用しても同じ結果が得られます。

4

3 に答える 3

0

Matlabはシングルスレッドのアプリケーションだと思います。マルチスレッドエグゼクティブを呼び出すと、出力をMatlabにパイプバックする際にさまざまな問題が発生します。Fortran mexファイルへの再コンパイルを検討しましたか?

于 2012-09-27T23:09:31.623 に答える
0

mex ファイルがスタンドアロンの実行可能ファイルよりも標準出力に出力されるかどうかはわかりません。

他のオプションがあります。1 つは、すべての診断結果をファイルに書き込み (追加) し、必要なときにファイルを見るだけです。たとえば、Emacs は、ファイルの内容を毎秒、または設定した間隔に合わせて自動的に「元に戻します」。別のオプションは、fortran ソースを matlab ソース (f2matlab を参照) に変換し、すべてを matlab に保持することです。

bb

于 2012-09-28T01:00:53.350 に答える
0

システム関数のドキュメントによると

[status, result] = system('command') は、完了ステータスを status 変数に返し、コマンドの結果を result 変数に返します。

[status,result] = system('command','-echo') もコマンド ウィンドウへの出力を強制します。

そのため、システム コールに「-echo」パラメータを使用して、コマンド ウィンドウで直接出力を確認する必要があります。

system(['cd "',handles.indir,'";chmod u+x ./qp.exe',... ';./qp.exe'], '-echo')

または、stdout を変数に割り当てることができます。

[ret txt] = system(['cd "',handles.indir,'";chmod u+x ./qp.exe',... ';./qp.exe'])
于 2012-09-29T06:18:26.983 に答える