家には使っていないパソコンがたくさんあります。それらを利用して、コードをほとんどまたはまったく変更せずに C# プログラムを並列化する最も簡単な方法は何ですか?
私がやろうとしているタスクには、多くの英語の文をループすることが含まれます。データセットは簡単に小さなチャンクに分割でき、異なるマシンで同時に処理できます。
家には使っていないパソコンがたくさんあります。それらを利用して、コードをほとんどまたはまったく変更せずに C# プログラムを並列化する最も簡単な方法は何ですか?
私がやろうとしているタスクには、多くの英語の文をループすることが含まれます。データセットは簡単に小さなチャンクに分割でき、異なるマシンで同時に処理できます。
…コードの変更がほとんど、またはまったくない?
難しい。基本的に、ネットワークを介してプログラムのさまざまなインスタンス間で通信する方法として、WCF を検討してください。アルゴリズムによっては、構造を大幅に変更する必要がある場合と、まったく変更しない場合があります。いずれにせよ、問題を互いに独立して機能する部分に分割する方法を見つける必要があります。次に、これらのパーツを異なるインスタンス間で分散し、結果のデータを収集する方法を考案する必要があります。
PLinqは、大きな変更を加えることなくプログラムを並列化するための優れた方法を提供しますが、これは 1 つのプロセスで、異なるスレッド間でのみ機能し、アルゴリズムが並列化に適している場合にのみ機能します。一般に、手動のリファクタリングが必要です。
Dryad (Microsoft の MapReduce のバリエーション) は、まさにこの問題に対処します (複数の PC で .net プログラムを並列化します)。現在研究段階です。残念ながら、CTP はまだありません :-(
それはおそらく不可能です。
プログラムをどのように並列化するかは、プログラムの動作とその記述方法に完全に依存し、通常は大幅なコード変更が必要になり、プログラムが何倍にも複雑になります。
プログラムの並行性を簡単に向上させる通常の方法は、何度も繰り返されるタスクを取得し、そのタスクをチャンクに分割し、それらを異なるコアに送信して処理する関数を作成することです。
答えは、アプリケーションが実行する作業の性質によって異なります。作業のタイプが異なれば、可能な並列化ソリューションも異なります。一部のタイプでは、並列化する可能/実現可能な方法がありません。
私が考えることができる最も簡単なシナリオは、作業が個別のジョブ チャンクで簡単に壊れる可能性があるアプリケーションの場合です。この場合は、単一のジョブ チャンクで動作するようにアプリケーションを設計するだけです。新しいジョブを受け入れ、完成したジョブを配信する機能をアプリケーションに提供します。次に、その上にジョブ スケジューラを作成します。このスケジューラは、同じアプリケーション (1 台のマシンをスケジューラとして構成し、残りをクライアントとして構成) の一部にすることも、別のアプリケーションにすることもできます。
他にも考慮すべき点があります。マシン間の通信 (ファイル?、ネットワーク接続?) はどのように行われるか アプリケーションは、完了したジョブの割合について報告/照会できる必要がありますか?; アプリケーションが現在のジョブの処理を強制的に停止できるようにする必要がありますか?; 等。)。
より詳細な回答が必要な場合は、質問を編集して、アプリケーション、アプリケーションが解決する問題、予想される仕事の量などの詳細を含めてください。その後、コミュニティからより具体的な回答が得られます。
アプリケーションを分散システムで実行する必要があります。分散計算ウィンドウの場合は google、グリッド コンピューティングの場合は c# です。
各文は個別に処理されますか、それとも何らかの方法で結合されますか? 一度に 1 つの文を処理する場合は、コードを変更する必要はまったくありません。各マシンで同じコードを実行し、それらの間でデータ (文のリスト) を分割するだけです。これを行うには、データの一部を各マシンにインストールするか、データベースを共有して各マシンに異なるチャンクを割り当てます。
並列処理を容易にするためにコードを少し変更したい場合は、データベース全体を共有し、コードが処理されるたびに各文を「マーク」してから、次のマークされていない文を探して処理します。これにより、スレッド セーフの概念 (あるプロセッサが別のプロセッサに悪影響を及ぼさないようにする技術) を簡単に紹介できます。
いつものように、特定のアプリケーションについて提供できる詳細が多いほど、SO コミュニティはあなたの目的に合わせて回答を調整することができます。
頑張ってください -- これは興味深いプロジェクトのようですね!
フローベースプログラミングを見たいと思うかもしれません-それはJavaとC#の実装を持っています。この問題へのほとんどのアプローチは、従来のシングルスレッドプログラムを使用して、どの部分を並行して実行できるかを把握することを含みます。FBPは別のアプローチを採用しています。アプリケーションは、非同期で実行される複数の「ブラックボックス」コンポーネントの観点から設計されています(製造組立ラインを考えてみてください)。従来のシングルスレッドプログラムはFBP環境では単一のコンポーネントのように機能するため、既存のアプリケーションを拡張するのは非常に簡単です。実際、既存のアプリの一部は、アプリの他の部分(つまり、サブルーチンではない)と非同期で実行できる場合、分割して個別のコンポーネントに変換できることがよくあります。誰かがこれを「氷山を角氷に変える」と呼びました)。
コモディティベースのハードウェアを使用できるようにするソフトウェアソリューションがいくつかあります。1つはAppistryです。私はAppistryで働いており、数百台のマシンでC#アプリケーションを実行するための多数のソリューションを実行してきました。
いくつかの便利なリンク: http: //www.appistry.com/resource-library/index.html
ここから無料で製品をダウンロードできます:http: //www.appistry.com/developers/
これがお役に立てば幸いです-ブレット
プログラムの並列化に投資する前に、データセットを細かく分割して、各コンピューターでプログラムを手動で実行し、出力を手動で照合してみませんか。それが機能する場合は、スクリプトを使用して自動化し、出力を照合するプログラムを作成してください。