R拡張機能のサポート
GraalVM Rランタイムでは、次の2つのモードでR拡張機能を実行できます:
- ネイティブ: GNU RがR拡張機能を実行するのと同じように、ネイティブ・マシン・コードがCPUで直接実行されます。
- llvm: LLVMビットコードが使用可能な場合、GraalVMに付属しているLLVMインタプリタでそれを解釈できます。
ネイティブ・モードは、プリミティブ配列で動作するプレーンCやFortranの数値計算など、R APIと広範囲にはやり取りしないコードに適しています。llvmモードでは、RとC/C++コードの間で頻繁にコールされる拡張機能のパフォーマンスが大幅に向上します。これは、GraalVMのLLVMランタイムもRコードのように部分的に評価されるためです。どちらも、1つのコンパイル・ユニットとしてインライン化および最適化できます。さらに、GraalVMのLLVMランタイムはGraalVMツールによってサポートされており、たとえば、ユーザーはRコードとCコードを一緒にデバッグできます。
1つのGraalVM Rプロセスで、任意のRパッケージをどちらのモードでもロードできます。つまり、GraalVMのRランタイムでは、ネイティブ・モードでロードされたパッケージとllvmモードでロードされたパッケージを1つのプロセスに混在させることがサポートされています。
LLVMビットコードの生成
バージョン19.3.0以降、GraalVM Rランタイムは、LLVMツールチェーンを使用してRパッケージのネイティブ・コードをコンパイルするように構成されます。このツールチェーンでは、特定のシステムについて標準の実行可能バイナリが生成されますが、それに対応するLLVMビットコードもそれらに埋め込まれます。LLVMツールチェーンによって生成されたバイナリは、ネイティブとllvmの両方のモードでロードできます。
次を実行すると、Rパッケージのインストール時にシステムのデフォルト・コンパイラを使用するようにGraalVM Rランタイムを再構成できます:
# use local installation of GGC:
R -e 'fastr.setToolchain("native")'
# to revert back to using the GraalVM's LLVM toolchain:
R -e 'fastr.setToolchain("llvm")'
システムのデフォルト・コンパイラを使用する方が信頼性が高い場合がありますが、埋込みビットコードが含まれなくなるため、LLVMツールチェーンでビルドされたRパッケージをllvmモードでロードできなくなります。さらに、ローカル・システムのデフォルト・コンパイラによってビルドされたパッケージとLLVMツールチェーンによってビルドされたパッケージを1つのRプロセスに混在させると、リンクの問題が発生する可能性があります。
Fortranコンパイラ
バージョン20.1.0以降、GraalVM Rランタイムでは、Rパッケージのインストール時にデフォルトのFortranコンパイラとしてgfortran
が使用されます。gfortran
ではビットコードを生成できないため、Fortranコードを含むパッケージはllvmモードでは動作しません。
GraalVM Rランタイムには、FortranコードをCに変換した後、LLVMツールチェーンでそれをコンパイルできるF2Cツールが含まれています。ユーザーは、構成ファイルR_HOME/etc/Makeconf
の変数FC
を編集することによって、このツールを使用するようにGraalVMのRランタイムを構成できます。
実行モードの選択
バージョン19.3.0以降、GraalVMのRランタイムでは次のデフォルトが使用されます:
- ネイティブ・モードでパッケージをロード
- llvmツールチェーンでそれらのソースをビルド
パッケージのロードについてllvmモードを有効にするには、--R.BackEnd=llvm
を使用します。次を使用して、指定したRパッケージについてそれぞれのモードを個別に選択して有効にすることもできます:
--R.BackEndLLVM=package1,package2
--R.BackEndNative=package1,package2
さらに、どのパッケージを常にネイティブ・モードで実行するかをファイルR_HOME/etc/native-packages
で構成できます。GraalVMのRランタイムには、llvmモードではまだ動作しないことがわかっている一般的なRパッケージを対象とするデフォルト構成が用意されています。