Cで記述されたシリアル(非並列)アプリケーションがあります。インテルスレッディングビルディングブロックを使用して変更および再記述しました。クアッドコアマシンであるAMDPhenomIIマシンでこの並列バージョンを実行すると、4倍以上のパフォーマンスが向上し、アムダールの法則と矛盾します。誰かが私にこれが起こっている理由を教えてもらえますか?
ありがとう、Rakesh。
プログラムを書き直すと、より効率的になります。アムダールの法則は、並列処理による高速化の量を制限するだけであり、コードを改善することでコードをどれだけ高速化できるかではありません。
4つのプロシージャすべてを使用できるようになったため、4倍のキャッシュを持つことの効果を実感できます。または、マシンで実行されている他のプロセスとの競合が少ない可能性があります。または、誤って予測されたブランチを修正しました。
TL / DR:それは起こります。
これは「スーパーリニアスピードアップ」として知られており、さまざまな理由で発生する可能性がありますが、最も一般的な根本原因はおそらくキャッシュの動作です。通常、超線形スピードアップが発生した場合、シーケンシャルバージョンをより効率的にすることができるという手がかりになります。
たとえば、一部のコアがL2キャッシュ(最近では一般的なアーキテクチャ)を共有するプロセッサがあり、アルゴリズムが大規模なデータ構造を複数回トラバーサルするとします。トラバーサルを順番に実行する場合、各トラバーサルはデータをL2キャッシュに新たにプルする必要がありますが、トラバーサルを並行して実行する場合、トラバーサルが実行される限り、これらのミスの多くを回避できます。ステップ(ステップから抜け出すことは、ここで予測できないパフォーマンスの良い情報源です)。シーケンシャルベライゾンをより効率的にするために、トラバーサルをインターリーブして、局所性を向上させることができます。
誰かが私にこれが起こっている理由を教えてもらえますか?
一言で言えば、キャッシュ。
各コアには独自のL1キャッシュがあるため、コアを増やすだけで、インプレイのキャッシュの量が増え、より多くのデータが処理される場所に近づきます。それだけでパフォーマンスを大幅に向上させることができます(シングルコアに大きなキャッシュがあるかのように)。効果的な並列化によるほぼ線形の高速化と組み合わせると、全体的に超線形のパフォーマンスの向上を確認できます。