2011-02-09 11 views
8

Intel VTune Amplifierの優れた経験を持つ方にこのことについて教えていただければ幸いです。プロファイラ出力のスレッド同時処理オーバーヘッド時間の意味は何ですか?

最近私のプログラムに対してインテルVTuneアンプを使用した他の人からパフォーマンス分析レポートを受け取りました。それは、スレッドの同時性領域にの高いオーバーヘッド時間があると伝えます。

オーバーヘッド時間の意味は?彼らは知りません(私に尋ねました)、私はIntel VTune Amplifierにアクセスできない。

曖昧なアイデアがあります。 pthread conditionが不安定である(または、私はひどくなかった)ので、私は以下のようなループ表情で作品を行うには、多くのルーチンを変更するように、このプログラムは、ターゲットプラットフォームに多くのスレッドスリープ呼び出しがあります。

while (true) 
{ 
    mutex.lock(); 
    if (event changed) 
    { 
     mutex.unlock(); 
     // do something 
     break; 
    } 
    else 
    { 
     mutex.unlock(); 
     usleep(3 * 1000); 
    } 
} 

これはオーバーヘッドとしてフラグを設定することができます時間

アドバイスはありますか?


私は約オーバーヘッド時間インテルのサイトからヘルプドキュメントを見つけました。 http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/win/ug_docs/olh/common/overhead_time.html#overhead_time

抜粋:

オーバーヘッド時間は、共有リソースの解放で始まり、そのリソースの受信で終わる期間です。理想的には、リソースを獲得するためにスレッドが待機する時間が短縮されるため、オーバーヘッド時間の長さは非常に短いです。ただし、並列アプリケーションのすべてのCPU時間が実際の有料作業を行うのに費やされるとは限りません。並列実行時(インテル®スレッディング・ビルディング・ブロック、OpenMP *)が非効率的に使用されている場合、並列実行時間内でCPU時間を無駄にする時間が多大な時間を費やす可能性があります。たとえば、これは、再帰的な並列アルゴリズムでの作業分割の粒度が低いために発生する可能性があります。作業負荷のサイズが小さすぎると、作業を分割してハウスキーピング作業を実行するオーバーヘッドが大きくなります。

まだ混乱しています..「あなたは不要/頻繁なロックを行った」という意味ですか?

+0

正確なデザインはわかりませんが、IMHOではこのオーバーヘッドのコンテキスト切り替え時間も追加することがあります。 –

答えて

0

申し訳ありませんが、私はpthreadまたはインテルVTuneアンプのエキスパートではありませんが、はい、ミューテックスをロックしてロックを解除すると、おそらくオーバーヘッド時間となります。

mutexのロックとロック解除をシステムコールとして実装することができます。これは、プロファイラがスレッドオーバーヘッドの下でおそらく一塊になります。

0

私はvTuneに精通していませんが、スレッド間のOSオーバーヘッドの切り替えがあります。スレッドが停止し、プロセッサに別のスレッドがロードされるたびに、スレッドが次に実行されたときにリストアできるように、現在のスレッドコンテキストを格納する必要があり、処理を継続できるように新しいスレッドのコンテキストを復元する必要があります。

問題は、スレッドが多すぎるため、プロセッサがほとんどの時間をスレッド間で切り替えるために費やされていることが原因です。マルチスレッドアプリケーションは、プロセッサーと同じ数のスレッドがある場合、最も効率的に実行されます。

2

私はpthread自分でビットを使用しようとしましたが、私はあまり専門家ではありません。そのシンプルな[合理的に行う]マルチスレッドバージョンでは

for(i=0;i<NUM;i++) { 
    sum += array[i]; 
} 

は、私たちは、アレイの合計を計算するために、単純なシングルスレッドプログラムの例を見てみましょう、オーバーヘッド時間の私の理解を実証するために、コードでは、配列はスレッドごとに1つに分割され、各スレッドはそれぞれの合計を保持し、スレッドが完了すると合計が合計されます。

非常に書かれていないマルチスレッドバージョンでは、配列は以前と同じように分解され、すべてのスレッドはグローバル合計にatomicAddになる可能性があります。

この場合、原子の追加は、一度に1つのスレッドでのみ行うことができます。オーバヘッド時間は、他のすべてのスレッドが自分自身を実行するのを待っている間にどれくらいの時間を費やしているかの尺度と考えています(確かめたい場合は、このプログラムを作成してみてください)。

もちろん、セマフォとミューテックスの切り替えにかかる時間も考慮します。あなたのケースでは、おそらく、mutex.lockとmutex.unlockの内部にかなりの時間が費やされていることを意味します。

私は少し前にソフトウェアを並列化しました(pthread_barrierを使用しています)、障壁を実行するのに1つのスレッドを使用するよりも時間がかかるという問題がありました。その中に4つの障壁を持っていなければならないループが、オーバーヘッドをそれに値するものではないほど速く実行したことが判明しました。

関連する問題