2017年6月23日金曜日

R foreach で並列化

R で並列化・高速化を扱う場合、以下の2通りがあるようです。

1. 関数をC/C++ に移植。さらにCUDAを利用
2. foreach による並列化

頻繁に使うツールであれば前者でしょうが、今回はそこまでの頻度・意欲がありません。で、2を選択。

最初はビルド時の自動並列化のようなオプションがあるのか?と思い探してみましたが、見当たりません。代わりに見つけたのが 2 の foreach 。
R では、for を foreach に変更するだけで並列化してくれるようです。容易なためか、メジャーな手法のようですね。

先日のコードに対し foreach を使って並列化。
が、今度は排他制御に関するコマンドが見つかりません。複数のスレッドから同一変数への書き込みを避け、ファイルに追記するよう変更したのですが、タイミングが重なった場合にデータが飛んでしまいます。このあたりを制御するコマンドが見当たりません。また、foreach 内の break も効かないようです。

そのままではうまく動いてくれなかったので、部分的にコードを書き直し。

っで、計算!

今度はうまくいきまた。

1 コアで 11.5 時間だったのが、4 コアで 3.7 時間まで短縮できました。
6 コアでも計算してみましたが、頭打ち。メモリへのアクセスが集中しますので、遅くなったのでしょうか。
ま、それほど早い計算時間でもないのですが、このあたりが落としどころでしょうね。これ以上は 1 の方法、R から C へ移植しするしかないでしょう(実務なら、迷わずそちらを選びますが)。

扱いたいデータがもっと大きなサイズですので、3.7時間という結果は大きな制約です。データの前処理を考えないとだめでしょうね。なんだかベクトル化の方が早いかも?と思えてきました。

で、もう一度チャレンジ。

今度はクリアーできましたが、新たに問題発生。


続きは後日。

0 件のコメント:

コメントを投稿