Triad sou.

R で OpenMP を使ってみよう

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 を作りませんでした。


OpenMPTest_1.0-0.tar (Dropbox)

checker.R (Dropbox)

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 で頑張るならいろいろ調べないとやばそうだな、という印象です。