13:24:43)//--------------------------------------------------------------------------------//少ない知識ですが、恩返しと思いページを立ち上げています。//加筆修正、大歓迎です。markovchainmontecarlo(2015/09)//--------------------------------------------------------------------------------&color(red){&size(30){並列計算(snowfall)};};~~マルチコアが主流となってきているので、並列計算のパッケージである「snowfall」を紹介します。~なお、特に断りが無い場合はSocketクラスターを使用しています。~~&color(red){&size(40){現在編集中&br;調査中の内容があるため&br;信用に値しない内容も多分に含まれています。[#l002ea0d]&ref(並列概念.jpg);~並列化できる割合によって、理論上の限界が変わってきます。~([[アムダールの法則: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]]を参照)~~なお、計算負荷の不均一性やデータ入出力負荷が理由で、&size(20){&color(red){''かえって遅くなる''};};場合もあります。~~並列計算は計算速度向上の一つの手段にすぎません。~計算速度向上の手段はいくつもありますので、適切な方法を用いてください。familyは全て並列化可能です。~詳細な条件としては、「計算の順序を入れ替えても計算結果が同じである」事になります。familyも内部ではforを使用しているので、並列化できるfor・並列化できないforが存在します。-並列化できないforの例--ケース1:依存関係がある。~以下の例は、ひとつ前の数値に対して、関数hogeを適用するため並列化が出来ません。実行しないと正しい計算ができません。}これは、マルコフ連鎖にも言える事であり、マルコフ連鎖の生成スピードを上げようとするならばRcppを使用するなど並列計算ではない方法を用いなくてはなりません。~--ケース2:グローバル変数など、現在の環境以外の数値を変更する~以下の例は、Sys.sleepの時間によって休止する時間が不明であり、そのあとiをグローバル変数であるresultに代入するため並列化が出来ません。}もし仮に、iが2の時の休止時間が一番長いとすると、これを並列計算してしまうとグローバル変数であるresultは2になってしまいます。不安になるような事を書きましたが、上記のケースはどちらもsnowfallでは実現できないため、snowfallで並列計算を行う場合は気にしなくて大丈夫です。[#t808b6d7]|CENTER:package|CENTER:利点|CENTER:欠点|h|parallel|・デフォルトパッケージとしてインストールされる。&br;・誰でも使用できる?|・下記「snow」「multicore」のコピーみたいなものなので、少々使いにくい。&br;・snowで使用できたCPU使用状況を調査する「snow.time」が使用できない。||multicore|・parallelパッケージの基礎となった優秀なパッケージ&br;(だと思う。ウィンドウズ環境しかないため使用していません。)|・うゐんどうずで動かない。||snow|・様々な関数が用意されている。&br;・parallelパッケージの基礎となった優秀なパッケージ&br;・CPUの使用状況を調査する「snow.time」が使用できる。|・常にクラスターの指定をしなくてはならない。||snowfall|・クラスターの指定をする必要がない。&br;・関数の引数が(ほとんど)一緒。&br;・並列計算と通常処理を同じ関数でこなせる。ロード中です+sfInitでクラスターを準備する。CPUs.+(必要があれば)ワーカーに変数やオブジェクトを渡す。関数を使用して並列計算を行う。[#w237cd57]sfInitではcpusを指定します。~~ご自身のPCのCPU数を指定しますが、以下のコードも取得できます。~なお、ハイパースレッディングを備えたCPUではスレッド数が取得されます。#parallelのdetectCoresを使用して取得します。4スレッド数を指定するか、CPU数を指定するかはどちらでもいいと思います。~ちなみに私[markovchainmontecarlo]はスレッド数を指定しています。**並列関数は何を使用するのか[#t0cc6daa]とりあえず以下に従って、関数を書き換えてください。~引数は同じですので、いつも通りに計算できます。sfSapplyためしにsfSapplyを実行。[#l2899007]通常処理と並列処理が同じ関数で出来ます。~これは大変なメリットです!~試しに行ってみましょう。~~まずは通常の並列計算。3.162278並列をせずに初期化しても、通常通り計算できます。3.162278sfInitをし忘れても「sfInitしてないから、シーケンシャルで実行するね」と、自動的にsfInitを実行してくれます。[#n64a44e8]勝手にBIG3を決めてますが、意外とあたっていると思います。~以降、この「並列処理問題BIG3」に気を付けながら紹介していきます。[#sb5c037a]いくら並列化できるといっても、通常処理から並列化するのに関数をいちいち書き換えたりするのはとても面倒。~一般的なイメージとして~+まずは、通常処理を小規模なデータで意図とする結果が得られるかを確認+小規模なデータはそのままに、並列化のコードに書き換えてエラーと格闘+小規模なデータで並列化をして、通常処理と同じ結果が得られることを確認+晴れて、大規模並列化へこれ結構面倒ですよね。[#pf5d043e]計算負荷が均一の場合は、あまり気にせず並列化を行えます。~24時間かかっていた処理を4コアで実行すると6時間で終わります。~でも仮に、一つの計算がやたらと時間かかる場合で他のコアが待機状態になるコードを書いていたら~実際は18時間位かかってしまうかもしれません。~待機状態を以下に少なくして、PCやサーバー、ワークステーションの力を引き出してあげるかが重要です。[#qcc24116]並列計算では、並列に計算します。(禅問答みたいですが・・・)~並列に計算させるなら、それぞれの計算先にデータ(引数など)を送ったり、結果を受け取ったりします。~大容量のデータ送受信が必要な場合、その時間は無視できません。~計算自体の時間は早くなっても、それ以上にデータ入出力負荷がかかっては元も子もありません。~-データの入力負荷問題~入力負荷は並列関数を工夫する事で減らすことができます。~-データの出力負荷問題~出力負荷は並列関数側ではどうにもできません。~そのため、出力負荷問題は以降取扱いません。[#t1b44b3b]様々な並列関数が存在しますので、代表的な関数を調査していきます。[#k4c6f72c]関数snow.timeを使用することによって、各クラスターの稼働状況を確認できます。~この関数を使用しないと、各クラスターがいつ動いて、どれくらい入出力にかかっているかが分かりません。~クラスターの稼働状況を知るためにも必須アイテムです。snow.time(clusterApply(sfGetCluster(),sample(1:16),Sys.sleep))printで概要が示されます。snow.timeで取得したにはデータ2つあります。総経過時間と各クラスターの詳細なデータになります。13.01plotすることで、視覚的にわかるようになります。~(通常はplotして調査します。[#be678f90]いきなりですが、一覧表で特性をまとめてしまいます。)~|package|関数|コーディング問題|計算負荷問題|入出力負荷問題|備考|h|snow|clusterApply|CENTER:&size(20){-};|CENTER:&size(20){×};|CENTER:&size(20){×};|ここから始まる並列関数。&br;なお、内部的にするのが主な目的なので、この関数をそのまま使用することはないと思います。||snowfall|sfClusterApply|CENTER:&size(20){-};|CENTER:&size(20){-};|CENTER:&size(20){-};|要素数が指定したcpusを超えると使えないなど多くの問題があります。&br;よって、評価対象外。Balancing)を行うことにより、コンピュータの性能をフルに活かすことが出来ます。&br;なお、内部的にするのが主な目的なので、この関数をそのまま使用することはないと思います。||~|sfLapply&br;sfSapply&br;sfApply|CENTER:&size(20){○};|CENTER:&size(20){×};|CENTER:&size(20){○};|要素数を各クラスターへまとめて送るため通信は1回のみとなり、入出力負荷問題が解決。&br;ただし、計算負荷問題は残る。Balancing)版。&br;ただし、コーディング問題を犠牲にした上、一部の入出力負荷問題は残る。||snow|clusterMap|CENTER:&size(20){×};|CENTER:&size(20){×};|CENTER:&size(20){×};|mapplyの並列版。クラスターの指定が必要だったりします。&br;評価は散々だけど、無いよりましな並列関数。||snowfall|sfClusterMap|CENTER:&size(20){-};|CENTER:&size(20){-};|CENTER:&size(20){-};|実は未実装。&br;実は他にも「関数はあるけど未実装」の関数がsnowfallにはあります。[#cae9fdbd]並列関数はここから始まったといっても過言ではない、全ての基となる並列関数です。~~●概要~+各クラスターに対して、要素を順番に渡していく。~+全てのクラスターの計算終了を待ってから、次の要素をまた順番に渡していく。[#xf75520c]乏しい知識ですが、未実装関数を作成してみました。ご協力をお願いいたします。[#zaa1454b]並列計算を中断した場合は、必ずworkerをsfStop()で一度終了させてください。~終了しないと、意図としない結果が返ってきます。#やっぱり返る結果は意図としない結果。ページを立ち上げました。mokadaこのページに掲載されている情報に関する責任はすべてページ作成者あるいは投稿者にあり、Wiki管理者とは一切関係ありません。