13:24:43)追加された行はこの色です。削除された行はこの色です。//--------------------------------------------------------------------------------//少ない知識ですが、恩返しと思いページを立ち上げています。//加筆修正、大歓迎です。markovchainmontecarlo(2015/09)//--------------------------------------------------------------------------------&color(red){&size(30){並列計算(snowfall)};};~~マルチコアが主流となってきているので、並列計算のパッケージである「snowfall」を紹介します。~なお、特に断りが無い場合はSocketクラスターを使用しています。[#jc285812]計算速度を向上させたいが、煩わしいことはなるべく避けたい。~そのような方にとって、並列計算パッケージ「snowfall」は一つの方法かもしれません。~本記事は、以下の方を想定しています。~-[[Rコード最適化のコツと実例集]]を読んで、ベクトル化等出来ることはは既に行っている。使い方は分かっている。~-モンテカルロシミュレーションなどの繰り返しを大量に行う必要がある。~レベルとしては以下の方~-Rの強みであるベクトル化は意識しなくても行っている。familyよりも速度が速いことを知っている。バイトコンパイラー]]も知っていて、必要な関数には適用できる。&color(red){このレベル};高速化の手段はいくつかありますので、適切な方法を用いてください。「Rcpp」パッケージを利用すると爆速になります。(C言語を学ぶ必要があるため、「ちょっと試そうかな」という場合には向きません)-CUDA対応のグラフィックボードを持っている。gputools等を使用すると並列計算が速くなる可能性があります。馴染みの関数で簡単に並列化が出来る。-引数がほぼbaseの関数と一緒。&br;(snowではクラスターを引数に加える必要があるため、引数が若干異なる。Mode)処理から並列計算の処理へ移行する場合でも、プログラム本体の書き換えが不要。&br;(通常でテストをした後に並列化を実行できる。[#jf6ffc48]+ライブラリーの読み込み+sfInitでクラスターを準備する。+(必要があれば)ワーカーに変数やオブジェクトを渡す。関数を使用して並列計算を行う。1.84-4)|snowfallでは関数は定義されているが、以下のとおり。instead.&br;&br;sfApplyで代用する。1.84-4)|snowfallでは関数は定義されているが、以下のとおり。instead.&br;&br;sfApplyで代用する。1.84-4)|snowfallでは関数は定義されているが、以下のとおり。clusterMap&br;&br;snowfallの関数では代用できないため、並列化をする場合はsnowパッケージを使用する。[#hf8072c9]カテゴリーは主観で分けています。|CENTER:カテゴリー|CENTER:snow|CENTER:snowfall|CENTER:コメント|h|クラスター作成|makeCluster|sfInit|すべてsfInitで行えます。||~|makeSOCKcluster|~|~||~|makePVMcluster|~|~||~|makeMPIcluster|~|~||~|makeNWScluster|~|~||オブジェクトなどの引渡し|clusterExport|sfExport|各クラスターに特定のオブジェクトをエクスポートします。||~|CENTER:-|sfExportAll|各クラスターに全てのオブジェクトをエクスポートします。||~|CENTER:-|sfRemove|各クラスターから特定のオブジェクトを削除します。||~|CENTER:-|sfRemoveAll|各クラスターから全てのオブジェクトを削除します。||~|CENTER:-|sfLibrary|各クラスターにライブラリーを読み込ませます。||~|CENTER:-|sfSource|各クラスターにソースファイルを読み込ませます。1.84-4)||その他並列関数|clusterApply|sfClusterApply|sfClusterApplyはクラスター数以下の要素しか受け取れない。&br;(使えない関数の気がします。)||~|clusterApplyLB|sfClusterApplyLB|clusterApplyでは、1要素の計算が終わるまですべてのクラスターが待機していましたが&br;これは1要素の計算が終了次第次の計算に移ります。sfClusterApply)||~|CENTER:-|sfClusterApplySR|1要素の計算が終了するごとにsaveを行い、予期せぬ終了(サーバーメンテナンスなど)があった場合でも、続きから計算を始めることが出来ます。&br;(ただし、saveを頻繁に行うので遅くなるようです。%%%R%%%esults)||~|clusterCall|sfClusterCall|各クラスターに同一の命令文を実行させます。||~|clusterEvalQ|sfClusterEval|各クラスターに同一の未評価の命令文を実行させます。|sfClusterSetupRNG|乱数の生成をします。&br;(set.seedのようにNULLによって乱数の生成が出来ないため、少々扱いにくいです。|sfClusterSetupSPRNG|~||クラスターの終了|stopCluster|sfStop|||クラスターの使用状況|snow.time|CENTER:-|クラスターの使用状況を調査出来る関数です。||~|print|CENTER:-|printを拡張し、snow.timeで取得したクラスターの使用状況表示します。||~|plot|CENTER:-|plotを拡張し、snow.timeで取得したクラスターの使用状況表示します。||デバッグ|CENTER:-|sfCat|各クラスターにcat文を実行させます。||各種情報等|clusterSplit|sfClusterSplit|helpを参照の事。[#bbda15a6]並列化できる割合によって、理論上の性能向上の限界が変わってきます。([[アムダールの法則:https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A0%E3%83%80%E3%83%BC%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87]]を参照)~並列化できるタスクが90%ある場合性能向上の限界は10倍、半分しかない場合は2倍となります。~ここで並列化できないタスクとは各workerとの通信などを指します。~なお、&color(red){かえって遅くなる};場合もあります。[#mb615e37]|CENTER:クラスター|CENTER:コメント|h|SOCK|デフォルト。&br;追加パッケージ不要。ワークステーションやPCおよびノートPCに適する。||MPI|パッケージRmpiが必要。||PVM|パッケージrpvmが必要。||NWS|追加パッケージ不要。[#zaa1454b]並列計算を中断した場合は、必ずworkerをsfStop()で一度終了させてください。~終了しないと、意図としない結果が返ってきます。#やっぱり返る結果は意図としない結果。0.200**コア数を知りたい。[#w237cd57]以下のコードで取得できます。~なお、ハイパースレッディングを備えたCPUではスレッド数が取得されます。>#parallelのdetectCoresを使用して取得します。ページを立ち上げました。修正加筆、大歓迎です。mokadaこのページに掲載されている情報に関する責任はすべてページ作成者あるいは投稿者にあり、Wiki管理者とは一切関係ありません。