ハードウェア構成法

CPU実験とのギャップを埋めるために今年からCPUの動きを教える事にしたらしい。うぉ、小林先生最高 & ナイスタイミングすぎ。今手元に先生が書かれた小型CPUのコードが有るので観賞中。but written in VHDL


話によると、先生はまず信号パターンを決めてからVHDLに落とすらしい。実際にコードもそのようになっていて、トップ階層に if や case がずらずらと並んでおり、信号パターンを精密に再現したコードになっている。これは絶対速いんだろうけれど、それは設計が良いからで有って(職人芸)、初学者がこんなコードを書こうモノなら一瞬で挫折するだろうなぁと思った。全く言語の機能を全く活用していない(opencores.orgのコードなんかを見ていると、もうちょっと modularize されている)。まぁもうちょっと観賞しよう。


"<="オペレーターが並列的に代入される事を頭に入れておけとTAの人がおっしゃっていた。そういわれてみると、ロジック記述の他は、コードが並列的に実行されている様子が頭に浮かんで来る。なるほどー。頭にCPUが流れ込んでくるようでちょっと興奮。女の人の方がこういうのに向いていそうだなーと、ふと思った。

# TAの人に日記捕捉されてるのには参った...。

SigScheme開発録 (53)

本日も8時寝2時起きで真夜中Hack。しかし明日はフランス語の試験なので、良い所で切り上げる。半分ぐらいはシケプリ目を通したけど、右から左へ抜けていっている気がする。

  • SCM_OBJ_COMPACT
    • Yamakenさんが gc 周りを整理してくれはったのでそれに追従。ここはコア部分なので絶対にミス出来ないと自分に言い聞かせながらやってたんだけど、ミスしてしまった。すません...。
    • スタック上に S->car or S->cdr が NULL のオブジェクトが有る時がある。何か見落としてはいないか。
    • sweep_obj 時点で型情報が無い。何の為に S->cdr の GC bit が有るんだと自分に言い聞かせたい。はぅ。
      • 実装完了。
  • 実行時間測定 (time ./sscm bench/bench-fib.scm)
    • 以下のような結果になった。思ったより速度低下が無い感じ。
ビルドオプション 実行時間
SCM_DEBUG = 0, SCM_OBJ_COMPACT = 0 2.49s user 0.01s system 99% cpu 2.513 total
SCM_DEBUG = 0, SCM_OBJ_COMPACT = 1 3.05s user 0.00s system 99% cpu 3.059 total
  • メモリプロファイリング
    • 前にoxy君に教えてもらった方法で、valgrind 付属の massif を使ってメモリ使用量をグラフ化してみた。
    • libtool --mode=execute valgrind --tool=massif ./sscm bench/bench-let-loop.scm

当然ながら半分になっている。こっちは速度が2倍近く遅くなっているな。パフォーマンスチューニングが必要だ。

Haskell : List and Multiple Values as Monad

リストも Monad ですか。多値も Monad ですか。そうですか。考えた奴頭良すぎ...。以下SOEより。

{- List as Monad -}
instance Monad [] where
  m >>= k = concat (map k m)
  return x = [x]
  fail x = []

(>>=) :: [a] -> (b -> [b]) -> [b]
return :: a -> [a]

{- Multiple Values -}
do x <- [1, 2, 3]
   y <- [4, 5, 6]
   return (x, y)

<=> [1, 2, 3] >>= ( \x -> ( [4. 5. 6] >>=  ( \y -> return (x, y) )))
<=> [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]