R で OpenMP を使って並列演算できるかどうか試してみたのでメモを書いておこうと思います。
まず、Windows 環境では、RTools (MinGW) で OpenMP が使えなさそう (Re: Missing libpthread in RTools) でした。
しかし、R devel - gomp library with Rtools212 によると、TDM-GCC を使うと動いたということらしいので、TDM-GCC を入れて試してみました。
今回は OpenMPTest パッケージとしてパッケージを作って、必要最小限のファイルを適当に準備してみました。
必要なファイル
OpenMP を使ったソースファイルと、/OpenMPTest/src/Makevars や /OpenMPTest/src/Makevars.win (参考: Setting up “configure” for openMP in R) があればすぐに作れます。
twitter では [\R\R-2.12.2\etc\i386\Makeconf] っぽい、といいましたが、パッケージ側で切り替え可能でした (当たり前か)。
OpenMPTest.c
OpenMP - Wikipedia から Hello world をコピーして Rprintf() に変えたものを使いました。
#include <R.h> #include <stdio.h> #include "./OpenMPTest.h" #ifdef _OPENMP #include <omp.h> #include <pthread.h> #endif void omptest(void) { #ifdef _OPENMP int th_id, nthreads; #pragma omp parallel private(th_id) { th_id = omp_get_thread_num(); Rprintf("Hello World from thread %d\n", th_id); #pragma omp barrier if (th_id == 0) { nthreads = omp_get_num_threads(); Rprintf("There are %d threads\n", nthreads); } } #else Rprintf("Hello, world! OpenMP is not supported\n"); #endif }
Makevars
## -- compiling for OpenMP PKG_CFLAGS = -fopenmp ## ## -- linking for OpenMP PKG_LIBS = -fopenmp -lgomp
ソースは C で書いたので、PKG_CFLAGS に直しました。
また、今回は Windows 上で TDM-GCC を使って動かしてみたいので、Makevars.win を作りませんでした。
TDM-GCC からパッケージをビルドする
TDM-GCC を入れると、スタートメニューに MinGW32 -> MinGW Command Prompt ができているので、ここから Windows 用にパッケージをビルドしました。
rcmd build --binary OpenMPTest
実行すると [OpenMPTest_1.0-0.zip] というファイルができます。
また、[\MinGW\bin\pthreadGC2.dll] を [libpthread-2.dll] にリネームして、上記 zip ファイル中の [OpenMPTest_1.0-0.zip\OpenMPTest\libs\i386\] に入れました。
実行すると
パッケージ 'OpenMPTest' は無事に開封され、MD5 サムもチェックされました demo(OpenMPTest.demo) ---- ~~~~~~~~~~~~~~~ > library(OpenMPTest) > .C("omptest") Hello World from thread 0 Hello World from thread 1 There are 2 threads list()
実行するとこんな感じにちゃんと表示されるので、たぶん大丈夫なんだと思います。
Linux の方が手間がかからないっぽいので、近いうちに動くかどうか試してみようと思います。
Windows で頑張るならいろいろ調べないとやばそうだな、という印象です。