プロセッサ 2x

提供: IS2005 Wiki (CPU実験)
移動: 案内検索

目次

なんでもセミナー発表資料 (10/13)

media:プロセッサ_2x-20061013.ppt

注記:

で動作します。

  • OpenOffice.org Impress 2.0.4

では誤動作します。プロセッサ係はいずれにせよWindowsを使う羽目になるので、これに関しては問題ないでしょう:-)

不安定動作の謎 (3/16)

タイミング制約をすべて満たしているのにかかわらず、不安定動作に悩まされていた件で、「Virtex-II ユーザガイド」の「表 2-36 : 出力電源とグランドのペアに対して同時に切り替え可能な出力の最大数」を超えたためであるという伊東氏による仮説についてコメント。

確かに、おそらく全ての班で、20本あるAAへの出力に「LVCMOS25_12_slow」や「LVCMOS25_12_fast」を使っていたと思われる。うちの班でも「LVCMOS25_12_slow」を使っていた。

仮説の通りとすると、内部グランドの電位が外部グランドの電位とずれて、IOAへの入力が多少乱れていたわけだが、可能性はある。

まあ、来年以降に、不安定動作の謎解きは託されるんだろうが、解ければ、100MHz超も十分可能になってくると思う。

久しぶりにWindowsをシャットダウンする。(3/13)

家に戻ったときも基本的にModelsimを走らせたままだったので、かなり負荷をかけて連続稼動させていた。よくがんばってくれたPentium Mに多謝。

公開(3/13)

まだいくらか加筆しますが、忘れないうちに公開します。

Rivision 39(3/13)

media:プロセッサ_2x-20060313.zip

やべ形式を変えるのを忘れていた(3/13)

うっかりテキスト(P3)形式でコンテストに出場してしまったが、 バイナリ(P6)形式だと 25.186s だった罠。ワロス。 0.8s近く損をしたわけだが、文字通り、後の祭り。

続・備忘録(3/14)

一応、P6形式だと13.1億命令だったということを付け加えておく。

デバッグはずっとP3形式でやっていった。 RS-232Cのバグにすぐ気付けるので。

CALC  :              171703541  ADD   :               43576646
ADDI  :              321901579  SUB   :                 292351
LOAD  :              487866655  SLL0  :                  30123
STORE :               85034329  SLL1  :                      0
BEI   :               21754436  SLL2  :                    324
BNEI  :               93018824  SLL3  :                      0
BLI   :                1950423  SLL4  :               12546067
BGEI  :                 938519  SLL5  :                 342383
BE    :               28197411  SLL6  :                    324
BNE   :               14898388  SLL7  :                      1
BL    :                  58036  SRR0  :                  49320
BGE   :                  98630  SRR1  :                      0
FBL   :                 287774  SRR2  :                      0
FBLE  :               49777324  SRR3  :                      0
JAL   :               18575123  SRR4  :                      0
JR    :               18575123  SRR5  :                 136623
                                SRR6  :                      0
                                SRR7  :                      0
                                AND   :               25982741
                                OR    :                      0
                                XOR   :                   9829
                                XNOR  :                1926809
                                GET   :                   1300
                                PUT   :                  49168
                                FADD  :               60228833
                                FSUB  :               54728662
                                FMUL  :              119403804
                                FINV  :                 398845
                                FSQRT :                2197426

TOTAL :             1314636115
FERR  :               41725703
PFERR :                3805534
LERR  :               76009552

西川さんが寿司に招待してくれていますが(3/13)

いつがいいか教えてくだしあ > 班員の皆様

お疲れ様(3/13)

というか疲れがどっと出てきた。

安定動作(3/12 21:11)

コンパイラコードの最適化に伴い誤動作が突然頻発するようになっていたが ついに安定動作するbitファイルを発見。

26.386s

備忘録

CALC  :              174438386  ADD   :               43707684
ADDI  :              328751476  SUB   :                 453403
LOAD  :              510868095  SLL0  :                3256152
STORE :               85187602  SLL1  :                      0
BEI   :               21754436  SLL2  :                    324
BNEI  :               93018824  SLL3  :                      0
BLI   :                2056172  SLL4  :               12602664
BGEI  :                1061750  SLL5  :                 342383
BE    :               29765414  SLL6  :                    324
BNE   :               16483104  SLL7  :                      1
BL    :                1642752  SRR0  :                1634036
BGE   :                1796540  SRR1  :                      0
FBL   :                 287774  SRR2  :                      0
FBLE  :               49777324  SRR3  :                      0
JAL   :               18688317  SRR4  :                      0
JR    :               18688317  SRR5  :                 136623
                                SRR6  :                      0
                                SRR7  :                      0
                                AND   :               27567457
                                OR    :                      0
                                XOR   :                   9829
                                XNOR  :                1926809
                                GET   :                   1300
                                PUT   :                 154917
                                FADD  :               60228833
                                FSUB  :               54728662
                                FMUL  :              119403804
                                FINV  :                 398845
                                FSQRT :                2197426

TOTAL :             1354266283
FERR  :               30487998
PFERR :                2844389
LERR  :               76118480

改訂版 sin/cos (3/12)

取り込んでみると、なぜか全部0になる?

取り込み方を間違えたかな?

reply by 高山

すみません、まだバグがあってちゃんと動かないみたいです。今直しています。

データキャッシュ搭載 (3/12)

27.530s!!!!

分散RAM説対ブロックRAM説終焉せず (3/11)

ぉーん

ブロックRAMから分散RAMに変えると、より安定するという推計がでるんだが、なぜか実機だと不安定になるので256個可能な状態に戻す。

分散RAM説対ブロックRAM説終焉す (3/11)

64個でさえ使い切れていないということなので、レジスタを分散RAMで実現し64個で決め打ってしまいます。

100MHz動作 (3/11)

40秒

75MHz動作 (3/11)

53秒

祝完全動作 (3/11)

結局のところ、現在のソースコードだと、ISE7でコンパイルするとバグり、ISE6でコンパイルするとバグらないようだ。なんだこの野郎。

コンパイラバージョン コンパイルオプション 命令数 実行時間
なし 60億 50MHz 230秒
-inline 50 42億 50MHz 158秒
-inline 10000 15億 50MHz 79秒

さてチューニングを続けます。準備工事がとっくに済んでいるデータキャッシュをようやく載せるとか。

デバッグその11 (3/11)

最新シミュレータの画像とdiffを取ったら出なくなった。古いシミュレータの画像とdiffを取っていた罠。

お (3/11)

なんか動いた。まだdiffが出ている。

デバッグその10 (3/11)

旧ライブラリにバッファオーバーフローの対処をしてみる。

あ (3/11)

RS-232Cまわりがおかしい。

デバッグその9 (3/10)

Modelsimで動いたので、実機で動かしたがうまく動かない。激しくやばい。眠い。

デバッグその8 (3/10)

fsqrt / finvのテーブルを間違えていた。

デバッグその7 (3/10)

fsqrtの指数部計算を間違えていた。

デバッグその6 (3/10)

レイトレの実行途中で、とあるfmulの中位ビットが1ずれた。仮数部計算の繰り上がりを一部考え忘れていた。

デバッグその5 (3/10)

レイトレの実行途中で、とあるfmulの最下位ビットが1ずれた。と思ったら、プロセッサでなく、シミュレータのFPUに問題があった。

デバッグその4 (3/10)

引数がa<bのfaddのシフト量が間違っていた。レイトレの実行途中、cos関数の中で問題が起こったので何が問題なのか調べるのに苦労した。

デバッグその3 (3/10)

引数が0のfmulが非正規化数を返していた。レイトレの実行途中、cos関数の中で問題が起こったので何が問題なのか調べるのに苦労した。

デバッグその2 (3/10)

subがaddになっていた。レイトレの実行途中、div関数の中で問題が起こったので何が問題なのか調べるのに苦労した。

デバッグその1 (3/9)

基盤に問題がありcserver だと RS-232C のオプションが DTR_CONTROL_ENABLE かつ DTR_CONTROL_ENABLE となっているため動かない。とりあえず DTR_CONTROL_DISABLE かつ DTR_CONTROL_DISABLE としておいて凌ぐしかないな。

全機能搭載完了(なくても動くデータキャッシュは除く) (3/9)

  • デバッグ <= Todo

Rivision 31 (3/8)

Rivision 26より久しぶりのバックアップ。

media:プロセッサ_2x-20060308.zip

  • プロセッサ2xは、キャッシュ、RS-232Cコンポーネントなど大幅に機能を加えた。
  • シミュレータは、高山氏による分岐系命令の不具合修正を取り込んでいる(はず)。さらにアセンブラ・シミュレータにfunctの変更を施した。sincosは、まだ取り込んでいない。
  • 最新版のコンパイラ2xは、含んでいない。(含んでいるのは少し旧版)

あと5日 (3/8)

  • 現在、レジスタの256個化は (ムダかも知れないが) 対応できてしまいそう。
  • 現在、100MHzは (たまたまかもしれないが) 実行できている。

TODO (3/8)

  • fdiv, fsqrtの2x化 <= Doing
  • デバッグ

TODO (3/6)

基本的に既に作ったコンポーネントの調整と修正だが。間に合うんだか。

  • accumulatorの同期化 <= Doing
  • communicatorのコンポーネント化
  • fdiv, fsqrtの2x化
  • デバッグ

Processor [1.5x](3/5)

インストラクションキャッシュを載せるとfib 38が100MHzで動かなくなった。ありふれた事象に思われたが、しかし…。

当初、ある意味、単なる部品である、SRAMやBlock RAMの制御に問題があると考えていた。だが、以降数日にわたって、さまざまなテストを試みたが、より自明な回路でさえ不具合を起こしており、同期回路の「命」であるクロックの生成、すなわちDCMの制御がうまくいっていないと考えざるをえない状況にある。

恐らく、インストラクションキャッシュを載せたことにより、DCMに負荷がかかった・DCMの配線が変わったためとしか思えないが、この大問題を、現状の漏れの乏しい技術力で、残り僅かな日数に、解決するのは不可能であり、このまま拘ったところでFPGAと心中する羽目になるだけであるので、当面安定動作する75MHzに日和る。

コードネームがあれだが、ベストエフォート100MHz、実測75MHzという釈明をしておく(何がだ)。

Revision 26 (2/25)

新プロセッサ機能追加、新アセンブラ、シミュレータ不具合修正。

media:プロセッサ_2x-20060225.zip

  • アセンブラに関してですが、309行のsubiのところで$_[2]と$_[1]を逆に、417行で(/^([^:]+):/)を(/^([^:#]+):/)にすべきではないでしょうか。 by 高山

ブランチ考(2/24)

それなりに巨大な演算ルーチンである、fmul, faddを加えた(ただし未検査)が、全く関係なく比較演算がクリティカルパスになっている。このままだと、分岐が3クロックとなるのは、致し方ないんだろうかねえ。執念で2クロックに持ち込むか、3クロックにする代わり、できた余裕で、レジスタを256個にするとか考えないといけない。本当に余裕があるのかかなり謎だが。

警告削り(2/24)

仮に記していた部分をほとんど埋めて、XSTの警告をかなり消したが、まだ微妙に残っている。

  • WARNING:Xst:646 - Signal <FRCDLX<35:24>> is assigned but never used.
  • WARNING:Xst:646 - Signal <FRCDLX<10:0>> is assigned but never used.
  • WARNING:Xst:646 - Signal <FRCDLY<35:24>> is assigned but never used.
  • WARNING:Xst:646 - Signal <FRCDLY<10:0>> is assigned but never used.
  • WARNING:Xst:646 - Signal <FRCDH<35:24>> is assigned but never used.

という、先に述べた板挟みによる警告と、

  • WARNING:Xst:1772 - You have explicitly defined initial contents for this RAM, which are currently ignored when the RAM is implemented with LUT resources, leading to incorrect circuit behavior. Changing the RAM description so that it is read synchronously will allow implementation on block RAM resources for which we provide full initial contents support.

という、謎警告。てか、初期内容など定義していないんだがNE。

ちなみに、FRCDLYは、自分がつけた信号名だが、FRaCtion Data Low of Y(Yの端数部下位)の略である。やはり、VHDLには、暗号的信号名が似合う。

警告板挟み(2/24)

ポートマップにて未使用のシグナルのエレメントをopenにして、ISEでWarningを出ないようにすると、ModelsimでWarning(やError)が出る。どっちつかずで後味が悪い。

fadd,fmul移植(2/23)

プロセッサ [1x]のfadd,fmulを移植・改良。思ったより楽だった。3クロックに余裕で収まったよう。

RS-232C書き込み動作(2/22)

読み込みは256kbpsで動くが、書き込みは128kbpsでしかきちんと動かない。ビットが化ける。デバイスマネージャの設定だと128kbpsしか選べないし、USBシリアル変換ケーブルの性能限界か。

RS-232C読み込み動作(2/21)

プロセッサ [2x]と別の実験用プロジェクトを作ってやってみる。あっさり動いた。

うちの班で利用を避けたNECの罠的ICは、115.2kbpsまでしか動かないし、115.2kbpsで動かすにも、通常のデューティー費比だとオーバークロックしないといけないので、やはり罠的らしい。

実機上でフィボナッチ動作(2/20)

手元にfib 38の計算時間が約15秒のと、約17秒のがある。17秒のは不安定な気もしたが、チューニングしたところ安定したようだ。とりあえず約17秒のを元にRS-232C機能を加えてみたい。

Revision 23 (2/18)

「バックアップしていないときにハードディスクが壊れる」というマーフィーの法則にしたがってバックアップ。これでハードディスクが壊れることなどないであろうw

media:プロセッサ_2x-20060218.zip

命令セット(ドラフト)に対応した新アセンブラ・シミュレータ(ただし未マージ)・および旧コンパイラを含んでいます。

再びModelsim上でフィボナッチ動作(2/18)

通信回路・浮動小数点演算回路を載せるために制御回路のクリティカルパスを大分削った。というか、キャッシュを一部省いてIPCを落とした。FPUとRS-232Cを積んでいない状態だと、115MHz程度である。

とりあえず大学へ向かってRS-232Cに取り掛かります。

一進一退(2/17)

IOAがUのまま変わらなねー、と思ったらZの代入文がないせいだった。 せめてXのまま変わらない、とかだったらすぐわかったんだが。 遅遅として進まぬ。

Meadow 3.00-dev of 2006-02-12(2/15)

動作が不安定な気がしたので一応更新したが、依然として不安定な気が。1月下旬あたりに変なパッチが当たったりしているんだろうか。まあ安定版を使えという話もあるが、もうずっと開発版を使っているので、今更戻るのもなんだな。

2/16追記: ハングアップしたようになった場合、メニューバーから何らかの項目を選択すると復帰するようだ。

「フェッチ汎用キャッシュ」か「ブランチ専用キャッシュ」か(2/15)

フェッチ汎用キャッシュ

命令領域を65536ワードに制限すれば、まあ間違いなく間に合う。単体だと遅いが、プリフェッチ機能をつけるなどすると、かなり速くできる可能性を持っている。ただしプリフェッチ機能のためにややこしい回路設計が要るようになりそうである。

ブランチ専用キャッシュ

CPUの動作周波数とSRAMの動作周波数とは同じであるから、帯域をブランチ・ロード・ストア命令に横取りされなければ、フェッチ自体にキャッシュなど要らない。ブランチ・ロード命令にキャッシュを作ると、帯域を横取りしてくるのは、ほとんどストア命令だけになる。ストア命令は、ブランチ・ロード命令と比べて僅かしかないはずなので、大丈夫なはず、というのが基本的な方針である。

単体でそこそこの速度が出るので、命令領域を制限せずに済むと思われる。

間に合うんだろうか(2/12)

間に合うんだろうか。

間に合うんだろうか。

続・キャッシュ性能推定(2/11)

ブランチミス

なんか風呂の中で「ブランチ専用キャッシュ」なる香具師を思いついたので一応実験してみる。。。

Seq Way base contest
512 1 1.13% 1.08%
1024 1 0.60% 0.67%

設計が多少ややこしくなるが、クリティカルパスの解消が可能か。。。決め手になりうるかどうか。。。

なお、"プリフェッチキャッシュ"と同じく、コードの最適化がなされると倍程度外れる気がするので、多少差し引いて考えたほうがいい。。。

眠い。。。

続・プリフェッチ考(2/6)

なんか拘っていると間に合わない気がしてきたので、レイトレ動いてからに先送りするかねぇ・・・。

プリフェッチ考(2/6)

無茶苦茶ややこしいのでまとめ。

  • [required]Miss信号が来ていると、抽象プリフェッチバッファにデータを溜めていく。
  • [required]バッファが溜まっていると、データとVaild信号を出す。
  • [required]Select信号が来るとバッファを捨ててアドレスを決めなおす。
  • [required]Disable信号が来ると、抽象的に言って、止まる。
  • [optional]バッファが溜まっていないときにDisable信号が来ると、止まらず、溜め続ける。Miss信号の如何にかかわらない。

Miss信号だけが1クロック遅れてやってくるのが非常に厄介。 なお後々Loaderの機能を付加するのでもっとややこしくなる罠。

3/16追記: のちにより洗練された形となった。当時考えたほどややこしくならずにできた。

Modelsim上でフィボナッチ動作(2/5)

なお、現在のアーキテクチャによるfib 38の推定所要時間は、8.99sとなる。

独り言(2/5)

いやなぜってさぁー、君ら、はい、レイトレなんて知ってるぅー?100KBって形をしているよねぇーレイトレって。
例えばよぉーおい、このレイトレのこの関数からキャッシュ何本引けますかぁーって言われたら何本引けるぅー?
おぉーん、あいっ、みんな見ろ見ろー、いいかーあいっ、いっぽーん、ねぇー、あーい、ぇ、それからぁー、あ、
にほーん、あーい、それからぁさーんぼーん、あぁーい、キャッシュはさんぼーん、コード数えてみ。
いっこぉ、にこぉ、さんこよんこぉ。あらあら、四個三本だ。こういう黄色いみたいなキャッシュ引きのことをぉ、
キャッシュミスって言うんだよぉー。いぃかぁー?それからぁ、こんな風になったらぁ、いぃかぁ?
これ二次キャッシュミスって言うんだよぉー。おーん。階層が合計三つ(ドン)以上になるとぉー、
もう、この式は成り立たない。キャッシュの本数とコードの個数は等しくならない!んんー?
だからこの解法じゃ解けなぁーい!でも安心してぇ。フィボナッチで出てくるようなぁ、キャッシュの本数問題、
そっから何本引けますか問題!いつも、この式が成り立つぅ、キャッシュとコードが一対一対応するぅ、
キャッシュが引けるようなベーシックな問題しか出されないからぁ!安心して君達はぁ!
tを数えたらいいんだよぉぅ。ただな、この解法を覚えたからといって、全てのキャッシュの本数が
数えられるようになったなどと思うな。所詮、手際よく解けるように作られたフィボナッチという
箱庭の中でしかぁー、いっ、生きていけない解答に過ぎないんだ。いぃかぁー?
だから受かるためだってそれでいいんだよ。ぉーん。ぃぃかー?


水玉潰し(2/4)

って確定ゲームかと思っていたのだが、

0 4 5
1 4 4
0 1 0

の結果が、

0 0 0
2 0 0
0 3 0

になるのか、

0 0 0
3 0 0
0 2 0

になるのかって不定なのかな。


キャッシュ性能測定(1/28, 1/29)

フェッチミス

Word Way base contest
1024 1 47.39% 40.68%
1024 2 36.36%
2048 1 24.91% 22.65%
2048 2 17.54%
4096 1 9.18% 5.98%
4096 2 4.78% 3.99%
8192 1 3.73% 1.68%
8192C 1 0.73% 1.41%
8192 2 0.12% 0.02%

だいたい1%のミスが0.5秒のロスぐらいになるのだろうか(プロセッサが頑張って100MHzを出し、コンパイラが頑張って1.5GInstを出すとの妄想のもとでの概算)。

プリフェッチミス

Word Way base contest
1024 1 5.54% 4.58%
1024 2 3.75%
2048 1 3.10% 2.63%
2048 2 1.87%
4096 1 1.31% 0.84%
4096 2 0.53% 0.47%
8192 1 0.55% 0.22%
8192C 1 0.14% 0.16%
8192 2 0.01% 0.00%

FetchにPrefetch機能を加えてみた。極めてよく当たっている。が、今後コードの最適化が進むと当たりにくくなる可能性があるので、多少差し引いて考えたほうがいい。

ロードミス

Word Way base contest
1024 1 8.08% 9.08%
1024 2
2048 1 7.29% 6.29%
2048 2
4096 1 5.73% 5.19%
4096 2 5.94% 4.82%
8192C 1 3.98% 9.18%
8192 1 2.91% 4.63%
8192 2 2.50% 4.41%

Way数は、2 Wayを考えていたが、ほとんど無意味のようである、良くなるどころかむしろ悪かったりするなど、驚きである。またWord数は、8K Wordを考えていたが、同様にほとんど無意味らしい。あまり工夫をしても仕方がなさそうなので、資源はFetch側に回したほうがよさげである。

だいたい1%のミスが0.1秒のロスぐらいになるのだろうか。Fetch Missが問答無用でパイプラインをストールさせるのに対し、Load Missは依存関係によるので、はっきりとはわからないが。

試験効果(1/28)

試験が迫ってくると、作業が止まる気がしていた。

しかし、現実逃避により、作業が普段よりもはかどるという可能性もある気がしてきた。

S.I.D.(1/28)

んf

レジスタ考(1/27)

命令の長さと命令キャッシュの大きさの問題により、64個としておきます。

というか数があると依存関係判定にかかる時間が延びるんだよな。

パイプライン考(1/24)

==決めたといいつつ何度も変えてすいません(実際かなり迷ってるんですよ)。 レジスタに、巨大な容量をもつ"Block SelectRAM"を使うのに落ち着きそうです。したがって、レジスタを、64個どころか、256個にできる可能性が非常にあります。==

現在のところ、パイプラインを、

  1. 命令解釈 / 依存関係解析
  2. 分岐実行 / ALU演算実行 / FPU演算実行(1)
  3. FPU演算実行(2)
  4. FPU演算実行(3)
  5. FPU演算実行(4)

の5段にしようかなと妄想中である。

本番向けプロセッサコードネーム(1/24)

とりあえず

Processor [2x]

にでもしようかと。一昨年、昨年の動作周波数は50MHzどまりなので、今年は何が何でも100MHzを目指そうという意気込みを一応表してみる。