4

Linux でマルチスレッド アプリケーションを作成しています。シナリオは次のとおりです。

クラスの x インスタンスがあり、BloomFiltery GB のデータ (使用可能なメモリよりも大きい) があるとします。各ブルーム フィルター インスタンスで、この y GB のデータのメンバーシップをテストする必要があります。さらに、すべてのプロセスまたはスレッド間でデータを共有できるようにデータを読み取るだけなので、並列プログラミングがタスクの高速化に役立つことは明らかです。

現在、Cilk、Cilk ++、または OpenMP のどれを使用するか (どちらが優れているか) について混乱しています。また、マルチスレッドとマルチプロセッシングのどちらを使用するかについて混乱しています

4

2 に答える 2

4

Cilk Plus は、Intel による Cilk の現在の実装です。どちらもマルチスレッド環境です。つまり、実行中に複数のスレッドが生成されます。

並列プログラミングに慣れていない場合は、すでに開発された順次コードの並列化が容易になるため、おそらく OpenMP の方が適しています。コードのシーケンシャル バージョンは既にありますか?

OpenMP は、プラグマを使用して、コードのどの部分を並列で実行する必要があるかをコンパイラーに指示します。あなたの問題を正しく理解していれば、おそらく次のようなものが必要です。

   #pragma omp parallel for firstprivate(array_of_bloom_filters)
   for i in DATA:
      check(i,array_of_bloom_filters);

データがスレッド間で共有されている間の競合を避けるために、異なるブルーム フィルターのインスタンスがすべてのスレッドで複製されます。

更新: この論文では、実際には非常に不均衡なアプリケーションを考慮しています。つまり、(異なるスレッドに割り当てられた) 異なるタスクが非常に異なるワークロードで発生する可能性があります。あなたが言及した論文を引用して、「スケジューリング、負荷分散、終了検出、およびタスクの粗大化戦略に挑戦する非常に不均衡なタスクグラフ」。スレッド間で計算のバランスをとるには、タスクのサイズを小さくして、同期にかかる時間を増やす必要があることを考慮してください。つまり、適切な負荷分散には常に代償が伴います。あなたの問題の説明はあまり詳細ではありませんが、あなたが抱えている問題はかなりバランスが取れているようです。そうでない場合は、Cilk を使用してください。そのワーク スティール アプローチは、おそらく不均衡なワークロードに対する最良のソリューションです。

于 2012-06-09T16:07:07.827 に答える
1

これが投稿された時点で、Intel は Cilk(tm) Plus の強化に多大な努力を払っていました。最近では、一部の取り組みが OpenMP 4.0 に向けられています。一般に、OpenMP と Cilk(tm) Plus を対比することは困難です。
スレッド間で作業を均等に分散できない場合は、OpenMP バージョンでスケジュール (ランタイム) を設定し、実行時に OMP_SCHEDULE=guided、OMP_SCHEDULE=dynamic,2、OMP_SCHEDULE= などの環境変数のさまざまな値を試します。自動。これらは、Cilk(tm) Plus のワーク スチールが機能する方法に最も近い OpenMP のアナロジーです。インテル® MKL ライブラリーの一部の疎行列関数は、実際には最初にジョブをスキャンし、作業のバランスをとるために各スレッドに割り当てる量を決定します。この方法が有用であるためには、シリアル スキャンと割り当てに費やされる時間が、並列作業に費やされる時間よりも低くなければなりません。ワークスティーリングまたは動的スケジューリングは、OMP_PROC_BIND=close などによってスレッドをキャッシュの局所性で固定することにより、キャッシュの局所性を促進する OpenMP の潜在的な利点の多くを失う可能性があります。貧弱なキャッシュの局所性は、リモート メモリ アクセスにかなりの時間がかかる可能性がある NUMA アーキテクチャではより大きな問題になります。OpenMP と Cilk(tm) Plus の両方に、シリアル実行とパラレル実行を切り替える機能があります。

于 2014-01-20T14:08:50.167 に答える