1

9000 回以上の反復を行う for ループがあり、10 などのスレッドで何とか改善したいとしましょう。

Function Something(){

    for ( i = 0; i < 9000 ){
        DoStuff();
    }
}

10 個のスレッドで 9000 回の反復をカバーする最善の方法は何でしょうか? 現在、C++99 と win32 の pthreads を使用していますが、これは一般的な質問だと思います。

前もって感謝します。

編集: この例では、 DoStuff() が他の反復から独立して重い処理を処理するとします。また、共有リソースがありますが、それらはミューテックス変数でカバーされています。

4

4 に答える 4

3

答えは、DoStuff()実際に何をするかによって異なります。大きなベクトルを別の大きな (または小さな) ベクトルで乗算する場合、それを 10 のセクションに切り刻むことはおそらくそれほど難しくありません。これは、各計算が他の計算から独立している CPU 集中型の作業では問題なく機能します。すべての要素の合計を計算しても問題ありませんが、セクションを合計してから結果を保存し、すべてのスレッドが終了したら、さまざまなセクションを合計する必要があります。

並列化してもまったく役に立たない計算もあります。F(n) = F(n-1) + F(n-2) メソッドを使用したフィボナッチ数の計算は、現在の計算を行う前に前のステップの結果が必要になるため、スレッドではうまく機能しません。ステップ。

一方、DoStuff1 つのファイルから 1,000 万件のレコードを読み取る場合は、スレッドを増やしても効果があるとは考えにくいです。プロセッサよりも遅いため、何も得られません。

于 2013-06-11T17:02:48.550 に答える
0

内部にあるものに大きく依存しDoStuff()ます。そこにあるデータが他の反復に依存している場合、または更新されてDoStuff()実行間で共有する必要がある外部データにアクセスしている場合、スレッドは速度を低下させることさえあります。それDoStuff()自体から独立して実行でき、他のスレッドと競合しないメモリを格納する独自の場所があり、実行に十分な時間がかかり、スレッドのセットアップと完了時の結合の初期オーバーヘッドを克服する場合は、作成しますループの上に 10 個のスレッドを配置し、各スレッドにたとえば 900 回の反復を入れてコードを実行し、完了したらそれらを結合/強制終了します。または、スレッド プール コンストラクトを使用して、それを実行させます。

一般的な質問に対する一般的な回答。

于 2013-06-11T16:58:27.527 に答える