私はOpenMPとインテルTBBを使用してイメージ畳み込みとlu分解を並列化しました。私は1〜8のコアでそれをテストしています。しかし、OPENMPとTBBの1つのコアで、set_num_threads(1)とtask_scheduler_init InitTBB(1)を使って1つのスレッドを指定すると、 TBBのパフォーマンスは、TBBのオーバーヘッドによりシーケンシャルコードに比べていくらか小さな劣化を示しますが、驚くべきことにOpenMPはシングルコアのオーバヘッドを示さず、シーケンシャルコードと正確に等しく(インテルO3最適化レベルを使用して)私はOpenMPループの静的スケジューリングを使用しています。現実的ですか、私は間違いをしていますか?OpenMPオーバーヘッド
2
A
答えて
0
OpenMPは、コンパイラがすべての作業を行う場所です。コンパイラがシリアルコードになることがわかっている場合、常に並列ビットのすべてをスキップすることができます。
TBB基本的に単なる図書館です。あなたのアルゴリズムにパラレルでもシリアルでも実行するために必要な部分が装飾されている必要が常にあります。
2
OpenMPランタイムは、スレッドを1つだけ実行すると、スレッドを作成しない可能性があります。
また、OpenMP並列化ディレクティブを使用すると、というコードでも、本質的にコンパイラに詳細情報を与えているように、シリアルコードがより速く実行されます。例えば、ワークシェアリング構成は、ループの反復が互いに独立していることをコンパイラに伝えます。ループの反復はそれ自身では推測できず、より積極的な最適化戦略を使用することができます。もちろん、必ずしもそうではありませんが、私は「実世界のコード」でそれが起こるのを見ました。
0
OpenMPはコードの装飾部分(#pragma omg for/parallel)を(OpenMPなしで実行される)メインスレッドと追加のスレッドにフォークします。
1つのスレッドのみを使用するように設定した場合、これはメインスレッドであり、OpenMPディレクティブなしで実行されます。オーバーヘッドがなく、実行パスが分岐しなかったためです。
0
OpenMPについてのことは、コンパイラがあなたのために仕事をしていることです。シーケンシャルコードを最小限に変更する必要があり、各スレッドに与えられたタスクがかなり大きい場合は、 PthreadやC++ 11のスレッドを使ってコードをテストし、その結果を見てみることをお勧めします。
関連する問題
- 1. スレッド作成時のオーバーヘッドを避けるopenMP
- 2. OpenMP - forループのスレッドの生成と終了時のオーバーヘッド
- 3. オーバーヘッド?
- 4. セロリ - オーバーヘッド
- 5. メモリバリア/フェンスのオーバーヘッド
- 6. pthread mutexのオーバーヘッド?
- 7. 空のUIView:オーバーヘッド
- 8. リポジトリパターンとオーバーヘッド..?
- 9. GHC TypeLitsオーバーヘッド
- 10. Openedge 10.2B08 lruskipsオーバーヘッド
- 11. Scala Future [T]オーバーヘッド?
- 12. Java ObjectOutputStreamのオーバーヘッド?
- 13. Dropwizardメトリックパフォーマンス・オーバーヘッド
- 14. rxJavaのオーバーヘッド
- 15. メモリアロケータのオーバーヘッド
- 16. CoreDataメモリはオーバーヘッド
- 17. 行サイズのオーバーヘッド
- 18. OnCreateOptionsMenuメソッドのオーバーヘッド
- 19. OpenMPヘルプコード
- 20. OpenMPパラメータスイープパラレル
- 21. Openmpスレッドスリープ
- 22. のOpenMP
- 23. は、OpenMP
- 24. 再帰ラムダのオーバーヘッド
- 25. PPPとイーサネットのオーバーヘッド
- 26. ゴランのゴールールのオーバーヘッド
- 27. 複合インデックスのオーバーヘッド
- 28. Neo4j GCオーバーヘッド上限
- 29. Javaのリモートデバッグのオーバーヘッド
- 30. 画像ダウンロードのオーバーヘッド
'num_threads'から' set_num_threads(num_threads) 'までの引数が実行時にのみ、つまりユーザー入力からしかわからない場合、これも起こりますか? – Walter