# 本来は関係ないのだが、質問があったので、 Memory RAM ( Randam Access Memory ) Read/Write 可能 => 普通に「メモリ」といえば、こちらのこと ROM ( Read Only Memory ) cf. CD-RW : RAM CD-ROM : ROM # ROM と RAM は、対比させるべきものだが、名前は対比していない # ROM でも Randam Access 可能な Memory # RAM でなく RWM ( Read Write Memory ) ならよかった Randam Access カセットテープ : 頭から順番から CD-ROM : どこからでも Okey ( Randam Access ) ROM の分類 Mask Rom 本当に読むだけ EPROM 紫外線を当てると、書き換えが可能になる => 普段は読むだけだが、稀に書き換える RAM の分類 DRAM ( Dynamic ) => コンデンサー電荷で記憶 放電して、記憶が失われるので、これを さけるために、リフレッシュ ( 再充電 ) 4096 / 秒 SRAM ( Static ) => フリップフロップ回路で実現 DRAM は 1 bit / 1 トランジスタ SROM は 1 bit / 4 トランジスタ => 256 M bit DRAM と 64 M bit SRAM が同じ値段 Accsess Time ( CPU から Memory に内容を要求してからかえるまので時間 ) DRAM 50 〜 70 n (ナノ) sec SRAM 10 n sec DRAM は破壊読込 読み込むとそのデータは失われる # 「スパイ大作戦」の指令テープ.. 一度しか読めない 読んだ後にその結果を ( 壊れずに何度も読める .. ) Memory に、Copy し、書き戻す。 => 同じ Memory は、続けて読めない 一旦読み出してから、次に読めるまでの時間 => サイクルタイム 100 n sec 〜 200 n sec # 一桁遅い !! プログラムが妙に遅い場合... これが原因かも !! == # 先週に引続き.. Cache Memory ( 隠しメモリ ) 最初の実装は、IBM 360/81 で.. ( 最初の商業的実装 ) +---------------+ | CPU | 1 n sec ( 1 G Hz ) +---------------+ ^ | 速度差がある v +---------------+ | Memory | 50 n sec ( 20 M Hz ) +---------------+ CPU が Memory に Access すると、大変待たされる => CPU の Memory Access がボトルネックになる。 CPU の速度はどんどん早くなっているが、Memory は早くならない.. => 「キャッシュ」の導入 +---------------+ | CPU | 1 n sec ( 1 G Hz ) +---------------+ ^ | v +---------------+ | cache | 10 n sec +---------------+ SRAM ( 高速 / 小容量 ) ^ | v +---------------+ | Memory | 50 n sec ( 20 M Hz ) +---------------+ DRAM ( 低速 / 大容量 ) # 以下、キャッシュは一段として、議論するが、実際は、複数段ある。 # CPU の 1 chip 化が進み、CPU の一部に Cache を抱えている # => L1 # => 更に L2 も抱えている.. # => 元の外の Static RAM は L3 # 階層メモリ構造 例 Memory 512M / 50 n sec Cache 8M / 10 n sec CPU / 1 n sec なぜ、Cache は、役立つのか ? CPU の Access 範囲は、短時間であれば、局所的である Cache の振舞い 1) 先読をする 最初に読み出しを要求すると、次の何バイトかを とってくる ( Cache Line ) Memory のタイミング 前準備 + Copy .. => まとめると、前準備の部分が減らせる 最初の一個を取りにゆく ( 例 4 byte ) 50n + 40n = 90n くらい => 最初の 1 byte は遅い ( 90 n ) => 後の 3 byte は cache ( SRAM / 10 n ) => 10 n x 3 = 30n # 平均すると... # (90+30)/4 = 30 < 50 2) 再利用する 更に、cache の中の Memory ばかり参照すれば.. => 10 n sec に漸近して行く => Cache Hit 100% 何時もこう ( Hit 100% ) なら嬉しいが... 実際はそうもゆかない ex) 巨大行列 => Cache に入らない o ( Cache は memory より、小さいので.. ) 溢れたら.. => 一番古いものから、捨ててゆく。 # 丁度 Cache Out するサイズをアクセスすると.. # 悲惨 # # i.e. 行列の行方向か列方向かによって # アクセスの様子が異なる。 # => 4, 5 倍、差が出る。 # # => キャッシュが消えないように工夫する # 投機的 ( 博打.. ) 手法 # 面倒クサい... # 本来は「隠し」なのに、それを意識しないと.. # キャッシュサイズは計算機によって異なる # => その度にプログラムを変更する必要がある。 ## コンパイラが自動的に処理する可能性がある。 今の PC : 6000 x 6000 => 2, 3 時間 昔の スパコンでも 1000 x 1000 が大変 学生の PC でも 2000 x 2000 位は Okey L1 と L2 ( 共に CPU 内に内蔵 ) の違い o Memory Size が大きければ、Address も大きくなる N bit の Address => 2^N byte の Memory L1 + L2 にするとメモリサイズが大きくなる => Address も大きくなるので遅くなる o CPU は、複雑な仕組 ( 間違いを無くすのは大変.. ) => 新しい CPU ( Core ) の設計は大変 CPU + L1 に L2 を追加する形で拡張 => 設計が容易になる。 計算機を複雑にする理由 => 速度差 CPU / Cache / Memory / HD ( 2.5 inch ) HD の速度 ( 遅い理由 ) 円板 ( 磁気媒体 ) が回転している 磁気ヘッドを移動することによって読み出す Data 転送時間 ( 読み出し時間 10^(-6) ) 回転待ち時間 ( 1 m sec 位.. ) 磁気ヘッドを移動速度 ( Seek 時間 : 10m sec ) CPU ( 10^(-9) ) と 千万倍 => CPU を待たせない仕組が必要 Device Driver を作るのが大変 => DD を更新すると速くなる.. == Software を作るには、Hardware の内容が判っていたほうが良い。 => 大体説明した.. # 本当は I/O 廻りが難しいが、数値計算では利用しない.. 次回 : 最新アーキテクチャ == CPU の振舞い ( Pipe Line .. ) a <- b + c を次のように実行する 1) 命令を Memory からとってくる ( F ) 2) 命令を解読 ( デコード ) する ( D ) 3) データ b をとってくる ( L1 ) 4) c ( L2 ) 5) 加算 ( A ) 6) メモリ a にしまう ( ストア ) ( S ) 実行する命令である 4) - 6) は、異なる役割なので、異なる回路 異なる回路は、同時に利用できる => Pipe Line 方式 ( 時間方向並列 ) <= 空間方向の並列 ( CPU が複数あれば.. ) もし、同じような演算を繰り返すと... -> -> -> -> -> -> -> -> -> -> -> -> F D L1 L2 A S F D L1 L2 A S F D L1 L2 A S F D L1 L2 A S F D L1 L2 A S F D L1 L2 A S F D L1 L2 A S => 最大 6 倍の速度で動く Pipe Line が上手く行く場合と行かない場合 # 現在は、一つの演算 ( i.e. 加算 ) の中も更に分割され # Pipe Line 化 # 例 : 実数の加算 # o 指数部が異った場合、小数点の位置を変更する # o 結果の頭やお尻に 0 がついたら、すべてとる == 来週 ( 2003/05/27 ) まで 10 時 ( 演習なし ) 再来週 ( 2003/06/03 ) は 9 時から ( 演習あり )