FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Understanding the detailed Architecture of AMD's 64bit Core "The Floating Point Core"の翻訳が完了

http://ascii.jp/elem/000/000/649/649044/die_c_800x612.jpg

(ASCII記事より引用。Opteron 6200のダイ写真)

msyksphinz.hatenablog.com

前回の続き。Understanding of the detailed Architecture of AMD's 64bit Coreの浮動小数点の章を翻訳した。

原文はこちら。

http://chip-architect.com/news/2003_09_21_Detailed_Architecture_of_AMDs_64bit_Core.html#2

翻訳はこちら。

github.com

基本的に整数側のパイプラインと考え方は同じだが、スケジューラと、パイプラインの分類に対する考え方が異なるように思える。

通常のレジスタリネーミングと同じで、アーキテクチャレジスタと投機的レジスタの2つが存在している。アーキテクチャレジスタは非投機的な、つまりリタイアした命令、例外の発生しない命令によって生成された確定した情報、投機的レジスタは投機的実行によりまだ確定していないデータを意味する。Opteronでは、合計で120個のレジスタを持っており、それぞれアーキテクチャレジスタとリネームレジスタを構成している。

また、浮動小数点演算は一般的にレイテンシの長い演算であるので、依存関係のある命令が連続しているとそれだけで演算レイテンシが長くかかってしまう。 これを防ぐために、まずは演算の終了よりも1サイクル前にタグデータをリザルトバスに向かって出力する。 スケジューラはタグデータを受けて、待ち合わせをしているタグであれば、次のサイクルにリザルトバスからデータを受け取ることができるという前提で、命令を演算器に向けてイシューする。 これにより演算レイテンシをわずかながら隠ぺいすることができるというわけだ。

また浮動小数点演算の場合は、整数演算よりも多くのフラグ情報を扱う必要がある。このため、フラグのためにアウトオブオーダのハードウェアを追加し、なるべくフラグ参照のために演算能力が低下しないようにしている。

https://github.com/msyksphinz/sicp_exercise/raw/master/chip_archtect/2013_09_21/float_condition_code.JPG

例として、FCOMI命令のあとにFCMOV命令を実行するとする。 FCOMI命令は、浮動小数点演算データの比較を行い、その結果をCCビットに格納した上で、さらに整数側の状態レジスタにも書き込む命令だ。 このため、整数側への授受が必要になり、この時点でアウトオブオーダ実行ができなくなってしまう。 これを防ぐために、特別なバイパス回路を挿入し、アウトオブオーダで継続して実行できるようにしているというわけだ。

次回は、Opteronのデータキャッシュとロードストアユニットについて翻訳していこう。