6

バックグラウンド

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

両者の間に識別可能なパフォーマンスの違いはありません。

質問

誰かがこれを試して、良い結果を達成しましたか?

4

4 に答える 4

1

あなたは、「私が必要としているのは、2 つのハイパースレッドが常にローカル CPU のリソースをめぐって衝突するほど高密度/効率的ではないコードを生成することだと思います」と言います。それはかなり見当違いです。

CPU には一定量のリソースがあります。コードは一部のリソースを使用できますが、通常はすべてではありません。ハイパースレッディングとは、リソースを使用できるスレッドが 2 つあることを意味するため、これらのリソースのより高い割合が使用されます。

必要なのは、使用されるリソースの割合を最大化することです。効率的なコードは、そもそもこれらのリソースをより効率的に使用し、ハイパー スレッディングを追加するだけで役立ちます。ハイパー スレッディングではそれほど高速化されませんが、それはシングル スレッド コードの方が効率的であったため、既に高速化されているためです。ハイパー スレッディングによって大幅な高速化が実現したことを自慢したい場合は、効率の悪いコードから始めてください。最大速度が必要な場合は、効率的なコードから始めてください。

コードがレイテンシーによって制限されている場合、それはかなりの数の無駄な命令をペナルティなしで実行できることを意味します。ハイパースレッディングでは、これらの無駄な命令に実際にコストがかかります。そのため、ハイパー スレッディングでは、命令の数を最小限に抑える必要があります。特に、レイテンシによって隠され、シングル スレッド コードでは目に見えるコストがかからなかった命令についてはそうです。

于 2014-04-09T09:49:21.687 に答える
0

OpenCL または CUDA ツールキットをダウンロードして、グラフィック カード用のバージョンを実装することができます。おそらく、わずかな労力で 100 倍高速化できます。

于 2014-04-09T15:59:07.127 に答える