19

再帰線形代数計算のネストされたループに多くの Fortran サブルーチンを使用する R パッケージがあります (BLAS および LAPACK ルーチンに大きく依存します)。Fortran へのインターフェイスとして、.Fortran関数を使用します。C/C++ で記述されたサブルーチンの代わりに使用することに関するJonathan Callahan のブログ記事を読んだところですが、C で単純なラッパーを記述して、Fortran サブルーチンを使用する場合にもインターフェイスを使用する方がよいのではないかと考えました。 Fortran サブルーチン?.Call.C.Call

前述のように、私の Fortran コードは、double または integer 型の多次元配列で遊んでいるという意味で非常に単純です。しかし、R側で非常に多くのチェックを記述して、すべてがクラッシュしないようにする必要があることを学びました。これは、一部の行列のストレージモードを整数に変更するのを誤って忘れたり、一部の行列の次元が変更されたりしたためです。

サブルーチンは F90/95 として記述されます。

4

2 に答える 2

5

大規模なデータセットで作業している場合は、利点があるかもしれません。.Call は、関数を呼び出すたびにデータをコピーしないため、はるかに高速になる可能性があります。R 2.15.1 リリース ノートに記載されているため、この質問で説明されているケースでは、そのような利点はありません。

.C() および .Fortran() はコピーをあまり行いません: 生、論理、整数、実数、または複素数ベクトルであり、名前のない引数は、呼び出しの前にコピーされず、(名前の有無にかかわらず) 呼び出しの後にコピーされません。リストはコピーされなくなりました (C コードでは読み取り専用で使用されるはずです)。

.Call に切り替えるということは、.Fortran インターフェイスの利便性を放棄することを意味します。SEXP を C コードに渡し、(恐ろしく、十分に文書化されていない) R API を使用してデータのチェック/操作を行い、C から Fortran 関数を呼び出します。コードを操作する他の人は理解する必要があります。 R API と C/Fortran の相互運用性。

于 2013-04-03T18:21:56.283 に答える