[2006/12/25]印刷<<<184185186187188189190191192>>>188/421今年もこれが最後になってしまいました。なんか当初の予定よりチンタラ進む事になってしまってて(責任は筆者にあります)すいません。いうことで、今回はちょっとだけロングバージョン。Performance(続き)「x86命令の所要クロック計測スレPart2」の#592で示されたのは、ピークIPC=5になるという検証。lpというもので、これをぶん回すとループが1Cycleで完了するというものである。簡単に検証をしてみた。Cycleといった具合。ちなみにきっちり100000Cycleとかにならないのは、Cycle数測定のrdtsc命令のオーバーヘッド(もっと正確に言えば、rdtsc命令の結果をメモリに格納するオーバーヘッド)があるからである。これは無視していただくとして、確かに大雑把にConroeがピークでIPC=5で動作していることが判る。その直後の#593では、内容をちょっと変えるとループが廻るのに2Cycle掛かる事も示されている。ESIが使われる様になった。Cycleといったもの。Conroeが2Cycle/Loopに悪化したこともさることながら、YonahとかDothanでは2.1Cycle/Loopに悪化しているのも判る。fusionで処理することで、x86換算では5命令)処理でき、かつスケジューラもこれをそのままハンドリング出来る事が確認できた。以前この辺などで書いた、「x86換算で3命令がピークっぽい」という話は筆者の見込み違いということがこれで判ったわけだ。Yonahよりも確実にIPCそのものは向上している。Yonahは2.5Cycle/Loopまで悪化する。2がALU×3になったことの効果と言えそうだ。2に有利、K8に不利な内容である。いうのは、K8はそもそもx86換算で3命令までしか解釈できないデコーダの作りになっているからだ。いうことをちょっと試してみた。edx,[esi+12]という3パターンで実施した。このケースではaddの対象がESIレジスタで示した先になるので、内部ではload命令とadd命令に分解される。x86命令では5~7命令でも、MicroOp換算で言うと7~11命令換算となる。Cycleといった具合。大雑把に言えば、K8はほぼ3命令/Cycleの枠を守って動作するが、Intel系はどんどん性能が悪化する傾向にある。x86命令/Cycle程度であるが、試しにAddを8連続で投入するとおよそ8Cycle/Loop程度まで数字は悪化した。x86命令/Cycle程度でしかない計算だ。要するにアーキテクチャによる得手不得手が非常にはっきり分かれるという事が分かっただけである。2が3命令/Cycle「以上」を狙ってるとは筆者には考えにくい。2のIPCはK8を下回る程度でしかなく、そこをピーク性能の高さで補ってるという気がする。なんというか、昔のカーレースゲームで言うTurboボタンの様な、うまく最適化できた時だけは猛烈に速くなるが、普段はちょっと遅めな印象である。ちなみにこう感じる理由はこうした数字だけの話ではない。2は最適化に妙な制限が多い気がする。大体、汎用レジスタの制限にしても32bitモードはともかく64bitではこの制限はきつ過ぎる(汎用レジスタを増やした意味が無い)し、Macro-Fusionが64bitでは使えないとかもこの伝だ。M以降のパイプラインに実行ユニットの追加と64bitモードのサポート(ただしEM64Tではなく、Yamhill!)を加えた形で基本設計が進められ、途中でYamhillをEM64Tに置き換えただけ、という印象を受ける。Macro-Fusionについても、アイディアを十分に煮詰める時間はなく、無難に実装できる部分だけを搭載したという感じだ。Microarchitecrureは「完全64bitアーキテクチャまでの中継ぎ」ではないかと思っている。中継ぎアーキテクチャであれば、コア部はIPCが3程度あれば十分K8に拮抗できる。後はキャッシュの能力でK8に勝てると見なしたのだろうし、事実勝っていると思う。いう話は来年からさせていただく事にしたい。x86命令/Cycleを越えるという目標は、おそらく立てていない。IPCの向上は今後も続けようとする。いう、矛盾したものになると筆者は考えている。テストプログラムの解説さて、上のテストで使ったプログラムだが、ソースはこちらになる。先のスレッドに参加している方に説明は不要であろうが、アセンブラに慣れていない読者も多いと思うので、ちょっとだけ解説を入れておく。1に示すTest1()がピークIPC=5の検証コードであるが、時間測定はRDTSC命令を使っている。Counter)命令とは、CPU内部で動いている64bitカウンタを読み出して、上位32bitをEAXレジスタに、下位32bitをEDXレジスタに保存する命令である。この64bitカウンタは1Cycleに1づつInclementしており、例えば1MHzでCPUが動いていれば、毎秒1,000,000づつ数字が増える事になる。そこで、テストの直前と直後でRDTSCを呼び出してその値を保存しておき、あとで引き算すれば、テストに掛かったCycle数が概ねわかる事になる。←ここでカウンタの値がまたEAX/EDXにコピーEAX/EDXの値を保存して引き算となるから、処理時間にはテストの時間そのもの+EAX/EDXの値の保存の時間や、RDTSC命令そのものの処理時間も含まれることになる。これが多少ゆらぐので、上に示したテスト結果が多少ばらつく要因になっている。テストそのものにはあまり説明は要らないだろう。一応ダミーでバッファを確保しておき(A)、テストでESIレジスタが指す先はこのダミーバッファになるように設定してある(B)。ループ回数は上位から引数で渡すようにしてあり、最終的にはプログラムの引数で設定することになっている。エラーチェックとかは省いているので、あまり回数にでかいものを設定すると、バッファが(A)で確保できず、ESIの指す先が不定になるので、ESIを使って指定しているところ(D)で一般保護違反が出る可能性がある。ループ回数は程ほどにしておいてほしい。2003でBuildした。Buildしたアセンブルソースも確認したが、特に問題はなさそうである。プログラムはWin32のコマンドラインプログラムとして作ってある。6(Addの4連)まで順次実行した結果を表示して終るという単純なものである。4とかK7の環境をそろえ直す根性がなかったので、まだこうした環境がある方は試していただければと思う。最後にということで、今年一年お付き合い有難うございます。個別にコメントはいたしませんが、上述スレッドの参加者の皆様にも感謝いたします。いうか、このネタでこんなに引っ張るつもりは無かったんですが。来年はもうちょいチャッチャと進めて、次のネタに移る予定です。それでは皆様、良いお年をお迎えください。1/17]エンタメもっと見るページトップ。