5

R ルーチンの並列化をもう少し深く掘り下げようとしています。

一連の「ワーカー」プロセスの通信に関する私のオプションは何ですか

  1. それぞれの労働者の通信?
  2. マスター」プロセスとの労働者のコミュニケーション?

私の知る限り、マスタープロセスとすべてのワーカープロセスの両方がアクセスできる「共有環境/共有メモリ」などはありませんよね?

これまでに思いついた最良のアイデアは、JSON ドキュメントの読み取りとハード ドライブへの書き込みに基づいて通信を行うことです。それはおそらく悪い考えです;-) JSONはソフトウェア間の通信によく使用されるように見えるため、ファイルよりも選択.jsonした.Rdataので、その「標準」を使用することにしました。

より良いオプションについて学ぶことを楽しみにしています!

参考までに: 私は通常、基本パッケージのparallelと contrib パッケージのsnowfallの関数に基づいて並列化し、主に関数に依存しsfClusterApplyLB()て仕事を完了させています。

編集

私は Windows で実行していると述べるべきでしたが、Linux ベースの回答/ヒントも大歓迎です!

4

2 に答える 2

5

ハイパフォーマンスコンピューティングのCRANタスクビューで詳しく説明されているように、 NormMatloffによるRdsmパッケージは共有メモリ通信を提供します。

于 2012-07-20T16:08:57.353 に答える
5

プロセス間の通信の場合、開始するのに楽しい場所の1つは、ヘルプページ?socketConnectionsと「## Notrun:」とマークされたチャンク内のコードです。したがって、Rプロセスを開始して実行します

 con1 <- socketConnection(port = 6011, server=TRUE)

このプロセスはサーバーとして機能し、特定のポートで情報をリッスンします。次に、2番目のRプロセスを開始し、次のように入力します。

 con2 <- socketConnection(Sys.info()["nodename"], port = 6011)

プロセス2のcon2は、プロセス1のcon1とソケット接続を確立しました。con1に戻り、Rオブジェクトを書き出します。LETTERS

writeLines(LETTERS, con1)

con2でそれらを取得します。

readLines(con2)

したがって、ディスクに書き込むことなくプロセス間で通信しました。ここでは、いくつかの重要な概念も暗黙的に示されています。たとえば、ブロッキング接続と非ブロッキング接続についてです。コンピューターが接続されているネットワークを介してポートにアクセスできる場合は、同じマシンでの通信に限定されません。これが並列パッケージの基礎でありmakePSOCKcluster、プロセス1が実際にsystem並列パッケージのコマンドとスクリプトを使用してプロセス2を開始することに加えて、によって返されるオブジェクトmakePSOCKclusterはサブセット化可能であるため、特定のタスクを解決するためのクラスター。原則として、スポーンされたノードが、スポーンを行ったノードとは無関係に相互に通信するように調整できます。

興味深い演習は、parallelパッケージ内のフォークのようなコマンドを使用して同じことを行うことです(Windows以外の場合)。これの高レベルバージョンは、ヘルプページ?mcparallelにあります。

 p <- mcparallel(1:10)
 q <- mcparallel(1:20)
 # wait for both jobs to finish and collect all results
 res <- mccollect(list(p, q))

しかし、これは下位レベルの友人(およびソースコードsendMasterでピーク)の上に構築されています。mcparallelmccollect

RmpiパッケージはPSOCK、マネージャーがスクリプトを使用してワーカーを生成し、ソケットではなくmpiを使用して通信する例のようなアプローチを採用しています。ただし、MPI実装が機能している場合は、週末のプロジェクトに値する別のアプローチは、異なるデータに対して同じ計算を実行し、、、、、などのコマンドを使用して結果を単一のノードに照合するスクリプトを実装するmpi.comm.rankことmpi.barrierです。mpi.send.Robjmpi.recv.Robj

楽しい週末のプロジェクトでは、並列パッケージを使用して、並列計算を含むがmclapplyの種類ではないワークフローを実装します。たとえば、あるプロセスがWebサイトからデータを収集し、それを別のプロセスに渡してきれいな絵を描きます。最初のプロセスへの入力はJSONである可能性がありますが、R内の通信はおそらくRデータオブジェクトの方がはるかに適切です。

于 2012-07-20T21:39:19.557 に答える