R拡張機能のサポート

GraalVM Rランタイムでは、次の2つのモードでR拡張機能を実行できます:

ネイティブ・モードは、プリミティブ配列で動作するプレーン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モードを有効にするには、--R.BackEnd=llvmを使用します。次を使用して、指定したRパッケージについてそれぞれのモードを個別に選択して有効にすることもできます:

さらに、どのパッケージを常にネイティブ・モードで実行するかをファイルR_HOME/etc/native-packagesで構成できます。GraalVMのRランタイムには、llvmモードではまだ動作しないことがわかっている一般的なRパッケージを対象とするデフォルト構成が用意されています。