また、内部構造について簡単に触れたものも発見された(Photo06)。パイプラインについては、Decodeの後でZeroing Idiomsなる新しい拡張が追加されていることがわかるが、この詳細は不明である。で、実行ユニットには、
(1) Port 0/1/5にAVX命令の処理が追加された。
(2) Port 2/3の構成が同じになった。つまりDual LoadとかDual Store Addressの動作が可能になった。
(3) Memory ControllerとL1の間が48Bytes/cycle(!)に拡張された。
といった変更が見られる。厳密に言えば、Instruction Fetch & Decodeでも、AVXに対応するために変更がある筈だが、ここに明記されていないということは、AVX対応はそれほど大きな変更ではなかったということかもしれない。
Photo06: これは"How To Optimize Your Software For The Upcoming Intel Advanced Vector Extensions (Intel AVX)"というセッションのプレゼンテーションより。 |
このうち(1)は非常にリーズナブルである。AVXは、これまでのMMXやSSE同様にFPUと実行ユニットを共用していると思われ、なのでこうした形で搭載されるのはごく自然であろう。次に(2)だが、これはAVX対応でデータ幅が256bitに増えたから、従来の128bit Load/Storeでは不足するのでDualにしたのではなく、Load/Store Address/Store Dataは何れも256bit幅に拡張され、その上でPort 2/3が同じ構成になった様に見受けられる。理由は簡単で、C=A*B(A,B,Cは何れもAVXレジスタ、*は演算)をやろうとしたら、同時に2 Loadが必要だからだ。これに関してはAMDのBarcelonaの方が先に実装しており、Intelが後追いした様に見受けられる。
問題は(3)で、48Bytes/cycleというのは、多分16Bytes Load×2と16Bytes Storeを同時に行えるから48Bytes/cyleという事なのだろう。つまりSSE命令に関しては、完全命令スループットが1Cycleで実施可能な構成になった訳だ。ただしAVXに関しては、まだLoad/Storeを同時に行う事ができない。恐らく当初はAVXのLoad/Storeのスループットが低くてもそれほど問題ではなく、むしろSSEのスループットを底上げする事を重視したのと、ここでAVXにあわせて96Bytes/cycleの帯域を設けるのは実装上不可能だった事の両方が理由ではないか、と想像される。
Photo04に出てきた"More instructions per clock"の詳細は不明だが、とりあえずLoad性能を倍増させただけでも大きな効果があるだろう、というのは想像できる。逆に言えば、それ以外に関しては(謎の"Zeroing Idioms"を除くと)小変更に過ぎないのではないか? と筆者は考える。