ホーム 道しるべ 憩いの広場 濃緑空間 濃緑研の日記

Athlonの実数演算
ホーム ] 上へ ] Intel SSE ] 固定小数点概観 ] [ Athlonの実数演算 ] 緑青 ]

 

bulletFPU
 PowerPCの実力はわからないが、x86互換CPUとしては一級品のFPU性能であることは、ベンチマークサーキットの結果を見れば明らかである。
 Round1(重力シミュレーション)、Round2(行列演算)ともに驚くべき数値をたたき出していくれた。Round1、Round2とも同一クロックでの対PentiumII比50%という期待以上の結果といっていいであろう。
 特にデータの1次キャッシュヒットの効率を意識したコード(ストリ−ミングを意識した?)が威力を発揮しているようである。
 うるりさんの手によるC言語レベルの最適化コードの結果を見る限り、Cコンパイラで科学演算を行う場合Athlonを選択しない理由は見あたらない。

bullet3DNow!(SIMD:1命令複数データ処理)
 Round2の結果から、FPUと同じくストリーミングを意識したコードはやはり同一クロックにおけるK6-3DNow!、KNI(SSE)比50%の性能向上である。
 気になるのはストリーミングを意識しないで計算式にほぼ忠実にコーディングしたコード(私のコードがそれ)が50%以上性能ダウンしていることである。
 やはりKNI(SSE)に対抗すべくストリーミングを意識したコーディング(特にSOA:配列の構造体)を要求されるのであろうか。
 残念なのは、Round1の結果である、Athlonでは個々の命令のレイテンシが4である影響をもろに受けてしまったようである。(K6-3DNow!のレイテンシは2)

 3DCGアニメーションにとってジオメトリ演算性能(光源から受ける影の処理、座標変換)は非常に重要な要素ではあるが、そのような処理は今後徐々にグラフィックカード側で処理されるようになると考えられている昨今、物理シミュレーション能力こそPC側に求められる要素である。

 確かに3DCGアニメーションにとって24ビット精度(単精度浮動小数演算)は必要ない。そのためにも3DNow!は15ビット精度の逆数sqrt(平方根)を1命令(2クロック)で可能とした。(1命令でaqrtの逆数が求まるところなど、端から物理シミュレーションを意識したものと私は考えている) にもかかわらず、なぜ今回のAthlon3DNow!ではこの部分が犠牲にされたのであろう。
 確かに私の手元にAthlonがあるわけではないので、大量データを前提にした15ビット精度の重力シミュレーションをK6-3DNow!、KNI(SSE)に比べてみることはできないので、結論を出すのは早計に過ぎるが、現時点でAthlon3DNow!に期待を裏切られたという思いは拭い得ない

bullet整数演算(蛇足)
 いまさら整数演算命令を使って実数演算をする必然性などないので、とやかく言うことではないが、乗算を使用した整数演算がK6と大差なく、相変わらずPentiumIIに水をあけられたままなのは、少々期待はずれであった。

 

bulletベンチマークサーキットにおけるAthlonの結果をvさん、うるりさんが解説されていますので無断ではありますが、以下に引用させていただきました。

bulletATComp K6情報箱IIIでVさんが解説された文章を掲載させていただきます。
http://atcomp.bird.to/board/arc/k/k6board/31_3_40.html#40

bullet*Round 1**
http://member.nifty.ne.jp/kaz1-iwata/Round1/orbit.htm

人工衛星の位置を、加速度を積分しながら計算するアルゴリズム
です。おのおのの演算の間の依存性がきつく、パイプラインの
ストールが頻繁におこります.私のエントリーの I486/P6 OPTIMIZED
というのは、パイプラインの有無を意識して書き分けた fpu コード
です。いわゆるp6最適化をしているしていないです。

Athlonのたたき出した数字はそれ自身すごいものですが、パイプライン
への最適化にかかわらず同じ数字というところに戦慄してしまいます。
内部のスケジューラーが恐ろしくうまく働いて、コードの小ざかしい
違いを吸収しているようです。

3DNow!の結果がかなり遅いですが、こちらはそんなに驚くほど
のことではありません。3DNow!化によって、さらにコード間の
依存性が強くなっていますが、K6-IIIの3DNow!は、ローレイテンシ
なので速度を出せていたのです。Athlonでは、3DNow!のレイテンシが
大きくなっていますので、この手のコードは遅くなります。

bullet** Round2 ***
http://member.nifty.ne.jp/kaz1-iwata/Round2/testrun.htm

一目見て、げろを吐きそうになりました(二日酔い)
Round2は、行列の掛け算コードで、工夫によってパイプラインの
特性を引き出せるコードです。

ここではAthlonのパイプライン化がすさまじい勢いで噴出しています。
P6のFPUに比べて50-100%早い性能を軒並みに出しています。言葉が
ありません。

3DNow!でもパイプライン化によってピークで30%の性能向上を果たして
います。

ちょっとだけ引っかかるのは、Cコンパイラが吐き出したコードの
実行時間が異様に遅いことです。これは偶然だと思いますが。

bullet** 両テストに関する特記 **
戦慄すべきは、比較している数字が秒ではなくクロックだという
点です。つまり、おのおののCPUの性能は周波数差による違いを
ならして、純粋にコア設計を評価できるようにしているのです。

その上で50%もの性能向上を成し遂げたというのは恐るべきこと
です。

bulletこちらの憩いの広場にてうるりさんが解説された文章を掲載させていただきます。
bullet3DNow!について
 Round1では最適化コードでk6より約倍程度遅い。これはレイテンシが
 K6の3DNow!の2から4に倍増した影響そのまま。
 Round1はコードの前後依存性がかなり高いのでK6-3DNow!で既に並列性を
 使い切っていたため、Athlonはパイプラインが延びた分のマイナス面を
 露呈することになっている。

 Round2ではRound1とは対照的に並列性が高いので、レイテンシの影響が
 出ない上に、Athlonの強力なデコード能力によってK6-3DNow!を大幅に
 上回る驚異の結果を出している。デコード性能の向上で3DNow!コードの
 真の速度を出していると見ている。詳細はのちほど。

bulletFPUについて
 F3Benchの条件下でP6比で50%程度の高速化。スゴイ。
 P6同様fxchの使用で遅くなる現象が見られる。スケジューラが賢く、
 並列性を十分に抽出している証拠である。
 Round1で異常に速いのは演算レイテンシが低いことを表している
 可能性がある。ボトルネックのfsqrtが高速である可能性も大きい。
 Round2では圧倒的に速く、K6-3DNow!SISDに匹敵する。P6との差は
 乗算のスループットの差であろう。レイテンシの改善も考えられる。
 CのSDKコードが遅いのはショートループが苦手というパイプライン
 の性質が端的に出た例でしょう。

bulletまとめ
 多段パイプラインの特徴がマイナス面に出やすくなっている。
 レイテンシの小さい3DNow!ではデコード性能の向上が良く効いている。
 FPUが異常に速い。なにか面白い機能でも持っているのか?
 高クロック駆動されるので実際の動作ではさらに他のものより速い。
 詳しいデータシートが欲しい(爆)。

bulletAthlonは最高456クロックという理論値を超えてるような結果を出している。
ちなみに36*18と1*36の行列積1*18を計算するので、乗算36*18=648回、加算
35*18=630回、読み出し36*18+36*18=1296回、書き込み18回が通常必要になる。

2要素のSIMDと2本のパイプラインで乗算&加算は320クロック程度で実行できる。読み出し
は36*18+36*18/3=864回に最適化し、SIMDで430クロック。
乗算&加算と読み出しは並列可能なので430クロックが実行限界。

K6はSIMD&2命令同時デコードなので、(648+630+864)/2/2=536がデコード性能限界。
AthlonはSIMD&3命令同時デコードで(648+630+864)/2/3=357。
このそれぞれの限界値に、書き込み、アドレス計算、データ移動が加わるのでさらにクロッ
クを消費する。

K6ではデコード性能が頭打ちで演算器が遊んでいる状態であり、Athlonではデコード性能
が十分高くデータの読み込みで頭打ちになっている。Athlonは理論値に近い値を出してい
る点、ロスが少なく条件付きの理論値でないことに注目したい。

(Athlonの内部構造は推測です。AMDから詳しいデータシートが出て、間違っていれば修正
します(汗))