2011-09-14 8 views
4

std::vector<Object*>と言います。ベクトルは大きく(> 1000要素)、各Object*には広範囲な計算が必要です。各要素の計算をそれぞれ実行するforループは、簡単に並列化できます。実際に、私は最大のスピードアップのために並列にすべての1000個の要素を処理することができ(「あきれるほど平行?」)std :: vectorの異なる要素で並列に動作します

今私は2つのこと思ったんだけど:)

1を読み、異なる要素への書き込みが、それは安全ですstd::vectorロックなし? (ないベクター自体を修正する!)

2)は、スレッドにループ・発送のためカットして従うことが簡単な方法や慣習やパターンはありますか?

+0

鉱山2のための2セント)for_eachを使用します。http://www.cplusplus.com/reference/algorithm/for_each/ – Lucian

+0

@freerider:なし並列 –

+0

2:私はTBB(http://threadingbuildingblocks.org/が好きなの)データ処理を並列化します。 'parallel_for'を見てください。 – Simon

答えて

4

1)はい

2)あなたは、ベクトル処理をparalellizeするためのOpenMPを使用することができます。 Microsoft VC++ 2010を使用している場合、同時実行ライブラリにはparallel_forおよびparallel_for_eachアルゴリズムがあります。

4

1については、私の答えhere参照:

§23.2.2コンテナデータ競合を

2 /かかわらず(17.6.5.9)、実装は、データ競合を回避するために必要とされるとき、内容同じシーケンスの異なる要素に含まれるオブジェクトのうち、vector<bool>を除き、同時に変更されます。

明らかに、これはC++ 11(C++ 98/03ではスレッドの記述がないため)ですが、ほとんどの実装はすでに準拠しています。

私は慣習を知らないのでしょうか? OpenMPはおそらくこれを自動化することができます。

手動で行うには、すべてのオブジェクトが同じ時間を必要とするわけではないので、キューのようなシステムを使用することになります。スレッドをキューに入れると、最後まで並列処理を最大化することでこの問題を軽減できます。

+2

私は、 "ベクトル"を除いて驚くほど不便だったと思っていました。それは単なるHTML /フォーマットの問題でした:-) –

+0

@Steve:ooops ...コピー/ペーストは書式設定を保持しません。 –

0

VS 2010を使用している場合は、Parallel Patternsライブラリを使用してマルチスレッドを実現できます。

関連する問題