4

CPU 時間について、C++ および Fortran コードを含む R パッケージである OpenMx の関数をプロファイリングしようとしています。私のオペレーティングシステムは OS X 10.10 です。Rマニュアルのこのトピックに関するセクションを読みました。このセクションとこの投稿では、 Instruments を試してみることにしました。これが私がしたことです

  1. 開かれた楽器
  2. Time Profiler テンプレートの選択
  3. プレスレコード
  4. RStudio を使用して R スクリプトを開始しました

次の出力が得られます楽器の出力。コマンド ライン ツールのサンプルは、同じ出力を返します。

omxunsafedgemm_問題は、メイン スレッドから直接呼び出されるように見えること です。ただし、これは低レベルの Fortran 関数です。これは常に と呼ばれる C++ 関数によって呼び出されomxDGEMMます。この例omxDGEMMでは、最初に呼び出されomxCallRamExpectionます (つまり、呼び出しツリーのほぼ最下部にあります)。の合計時間omxDGEMMは 0 です。したがって、プロファイル情報は現在役に立ちません。

パッケージの元のバージョンでは、omxDGEMMインラインとして定義されています。問題が解決することを期待して、これを変更しました。そうではありませんでした。そのようにomxunsafedgemm呼び出されますomxDGEMM

F77_CALL(omxunsafedgemm)(&transa, &transb,
                        &(nrow), &(ncol), &(nmid),
                        &alpha, a->data, &(a->leading), 
                        b->data, &(b->leading),&beta, result->data, &(result->leading));

賢明なプロファイラー出力を取得する方法はありますか?

4

2 に答える 2

2

この問題は-O2、R がデフォルトで使用する gfortran コンパイラのフラグが原因で発生します。この-O2フラグは、フラグが有効にするすべての最適化ステップなどを-O1有効にします ( gcc マニュアル98 ページを参照)。-O1フラグが有効にする最適化フラグの 1 つは です-fomit-frame-pointer。計測器は、呼び出しフレームの親を知るためにフレーム ポインターを必要とします (この講演を参照)。

このように、

FFLAGS = -g -O2 $(LTO)

FFLAGS = -g -O2 -fno-omit-frame-pointer $(LTO)

${R_HOME}/etc/Makeconf問題を解決します。私のためR_HOME=/Library//Frameworks/R.framework/Versions/3.2/Resources

単純に省略して-O2も問題は解決しますが、OpenMx がかなり遅くなります (私の場合は 200 秒対 30 秒)。

于 2015-09-11T15:49:23.330 に答える
1

OpenMx バイナリが getOpenMx.R を介して OpenMx Web サイトから取得された場合、gcc/gfortran でコンパイルされます。CRAN から来たものであれば、OS X コンパイラ LLVM などでコンパイルされたはずです (ただし、OpenMP は LLVM と互換性がないため、並列計算は行われません)。したがって、他のバイナリを試して、プロファイリング用のタグが優れているかどうかを確認できます。使用していたバージョンと、バージョンの変更が役に立ったかどうかをお知らせください。

于 2015-09-11T14:44:46.497 に答える