バックグラウンド
2.67 GHz で動作する intel i5 M 480 を搭載したラップトップで 4 つのスレッドを実行する EP (Embarassingly Parallell) C アプリケーションがあります。この CPU には 2 つのハイパースレッド コアがあります。
4 つのスレッドは、データの異なるサブセットに対して同じコードを実行します。コードとデータは、いくつかのキャッシュ ラインに問題なく収まります (完全に L1 に収まり、余裕があります)。コードには分割が含まれておらず、基本的に CPU バウンドであり、使用可能なすべてのレジスタを使用し、シーケンスの完了時に結果を書き込むために (L1 の外側で) いくつかのメモリ アクセスを実行します。
コンパイラはmingw64 4.8.1、つまりかなり最近のものです。最適な基本最適化レベルは -O1 のようです。この場合、4 つのスレッドが 2 つよりも速く完了します。-O2 以上では、-Os と同様に実行が遅くなります (2 つのスレッドは 4 つよりも速く完了しますが、-O1 よりは遅くなります)。各スレッドは、平均して毎秒 337 万のシーケンスを実行し、それぞれ約 780 クロック サイクルになります。平均して、すべてのシーケンスは 25.5 のサブ操作、つまり 30.6 サイクルごとに 1 つの操作を実行します。
したがって、2 つのハイパースレッドが 30.6 サイクルで並列に実行することは、1 つのスレッドがそれぞれ 35 ~ 40 または 17.5 ~ 20 サイクルで順次実行することになります。
わたしはどこにいますか
私が必要としているのは、ローカル CPU のリソースをめぐって 2 つのハイパースレッドが常に衝突するほど高密度/効率的ではないコードを生成することだと思います。
これらのスイッチはかなりうまく機能します (モジュールごとにコンパイルする場合)。
-O1 -m64 -mthreads -g -Wall -c -fschedule-insns
#include 他のすべてを含む 1 つのモジュールをコンパイルするときにこれらを行うように
-O1 -m64 -mthreads -fschedule-insns -march=native -g -Wall -c -fwhole-program
両者の間に識別可能なパフォーマンスの違いはありません。
質問
誰かがこれを試して、良い結果を達成しましたか?