Closed37

CSAPP 第6章 メモリ階層

bayamasabayamasa

RAMには2種類存在する

  1. スタティックRAM
  2. ダイナミックRAM

この2つの大きな違いは、値を定期的に書き込む必要があるかないか

スタティックRAM
フリップフロップ回路を用いて値を保存させる。
そのため放電の考慮を必要とせず、値が常に保存されていることを保証する。
しかし、回路を必要とするため、DRAMに比べて一つの値を管理するための物理面積が大きい
そのため多くの値を保存することができない。

https://ja.wikipedia.org/wiki/Static_Random_Access_Memory#:~:text=SRAM内の各ビット,トランジスタを必要とする。&text=ビット線は読み取り操作,データ転送に使われる。

ダイナミックRAM
前提としてコンデンサは回路内部を流れる電流によって漏電などを起こす。
これによりコンデンサ内に値を保持している、DRAMは値を失ってしまう。

そのため、DRAMは同一の保存データを繰り返し書き込む必要があり、これによって値を保存しておくことができる。
これをリフレッシュという。
https://elite-lane.com/dram/

bayamasabayamasa

DRAMはその性質上、リフレッシュをする時間が存在する。
リフレッシュ中は書き込んだデータが保持されている保証はないので、
その時間帯において、CPUからの読み込み/書き込みをブロックする必要がある。

この性質から、メモリの読み込み速度が低下する事がある

bayamasabayamasa

DRAMから値を取り出すときはRow(行)にアクセスするRAS(Row Access Strobe), Column(列)にアクセスするCAS(Column Access Strobe)を使用する。

例えばスーパーセル(2, 1)にアクセスしたいとする
その場合の処理の順序は以下のようになる

  1. CPUからRASを、行アドレス2で送信する
  2. Row Address Bufferが行アドレス2の値をすべてバッファする
  3. CPUからCASを、列アドレス1で送信する
  4. Rowバッファから列1を取り出し、dataピンによって送信を行う
bayamasabayamasa

昔のメモリはDIP(Dual Inline Package)と呼び、マザーボードにはんだ付けされている状態だった。
https://ascii.jp/elem/000/000/600/600667/img.html

この状態だとメモリを後で増設しようと思ったときにすでにマザーボードとメモリがくっついているので、取り外しができなくメモリの増設などができない状態であった。

そのため新しく開発されたのがSIPである。
SIP(Single In-line Package)の略で、マザーボードと接合部分が一つしか存在しなく取り外しが可能なものだった。
https://www.google.com/search?q=SIP+memory&tbm=isch&ved=2ahUKEwiP4LC6sJvzAhUCa5QKHa12DzQQ2-cCegQIABAA&oq=SIP+memory&gs_lcp=CgNpbWcQAzoGCAAQBxAeOggIABAHEAUQHjoFCAAQgAQ6BwgAEIAEEAQ6BwgjEO8DECc6CggAEIAEELEDEAQ6BAgAEB46BAgAEBM6BggAEB4QEzoICAAQBRAeEBM6CAgAEAgQHhATUMazAViN7gFg_e8BaAZwAHgAgAFyiAGWCpIBBDEzLjKYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=J75PYc-wNoLW0QSt7b2gAw&bih=887&biw=1113#imgrc=d1WvowXJ2QAFPM

これによって増設などが容易に行えるようになったが、接合部分が少し貧弱だったので、折れてしまうなどの問題が発生した。
そこで少し実装コストが高いが強度に優れたSIMM(Single In-line Memory Module)が登場した。
現代で使っているメモリもこの形状である。
https://ascii.jp/elem/000/000/600/600672/img.html

bayamasabayamasa

SIMMは 8bit幅にしか対応しない構造だったため、もっと多くのデータをやり取りしたいという要望を叶えるものではなかったので、pinの数を増加した 64pin SIMMや88pin SIMMなどが開発された。これによりより多くのデータを保存することができた。

bayamasabayamasa

この流れを受けて登場したのがDIMM(Dual In-line Memory Module)である。
SIMMとDIMMの最大の違いは「信号ピンが片側か両方か」というところである。

DIMMは基盤の表と裏で別々の信号ピンが割り当てられている。
これにより大きさなどがほとんど一緒な72pin SIMMとDIMMでもDIMMのピン数は168pinとなっている

bayamasabayamasa

DIMMの開発要因としては64bit CPUの普及によりバス幅が64bitになったという点にある。
これによりメモリモジュールが64bit幅になることが期待された。

現在もメモリのバス幅は64bitのままである

bayamasabayamasa
bayamasabayamasa

SSDは電子を保存するという設計の都合上、1セルに対して値を書き込むということができない。
値を書き込む際には、他の部分の値を保存しておいてもう一度書き込み直すという方法で行う。

  • 読み込み/書き込みの場合
    ページと呼ばれる、一列の部分での操作を行う。

  • 更新/削除
    ブロックと呼ばれる 16 * 16 の単位毎に行う。

1セルを削除する場合のみにおいても全ブロックを更新しなければならないという特性上、命令数が増えて通信速度が遅くなるということと、寿命が縮まってしまうという欠点がある。

bayamasabayamasa

ブリッジ回路
チップセット。バスをCPU/メモリなどの主要機器にデータの受け渡しを行うI/Oコントローラー。
CPU/メモリなどの主要機器に近い範囲にあるチップセットをノースブリッジ。
I/Oデバイスなどに近い集積回路をサウスブリッジと呼んでいたが、現在はマザーボードに設置されているチップセットは一つになっているのでその名称は使われていない。
https://www.pc-master.jp/jisaku/chipset.html

bayamasabayamasa

HDD
ディスクストレージの中身には複数のディスクと、中の磁気を読み取るアームが存在している。
ディスクの中には微粒子が入っていて、その粒子が磁力的な特性を持ち、一つの方向に傾いていることにより、0と1を区別することができる。
磁力アームで磁気の方向性を読み取ることにより、0と1を判別してデータを読み書きする
https://www.youtube.com/watch?v=wteUW2sL7bc

bayamasabayamasa

DMA(ダイレクト・メモリ・アクセス)転送
CPUを介さずに、メモリとディスク間でデータの転送を行うこと。

DMA転送が終わった際に、CPU側に割り込み信号を行って通知する。
それまでは非同期で処理を行う事ができるので、並行処理を実現する。

bayamasabayamasa

現在のストレージ・テクノロジーにおいてボトルネックとなっているのはストレージ(HDD, SSD)とDRAMである。
SRAMの進化はCPUの成長速度に追いついているのでボトルネックにはなりにくい。
CPUはシングルコアでの成長が限界に達したことにより、マルチコア化に踏み切りレイテンシではなくスループットを向上させることで性能限界を上げてきた。

bayamasabayamasa

キャッシュヒット
あるレベルk + 1から特定のデータオブジェクトを検索するときに、もしレベルkにそのデータがキャッシュされていたら、それは キャッシュヒット とよばれ、読み出す速度が速くなる
レベルの例としては、DRAMにあるデータを探すときにL3キャッシュの方をまず見に行くといったようなものである。

もしなかった場合、それは キャッシュミス と呼ばれ、下位レベルのブロックをフェッチする。
もし上位キャッシュがすでにいっぱいであった場合、ブロックを上書きする。
これをreplace, evict(立ち退き)と言ったりもする

https://ja.wikipedia.org/wiki/キャッシュアルゴリズム

bayamasabayamasa

キャッシュの構造はウェブから始まっているものである

bayamasabayamasa

セットアソシアティブキャッシュ
ダイレクトマッピングはキャッシュミスを多く発生させてしまうことでreplaceの時間がかかってしまう。

これを解決する方法として、セットアソシアティブキャッシュというものが用いられる。
ダイレクトマッピングはメモリアドレス全体に対してCache sizeの分だけindexを分割することで、格納位置を定義していたが、セットアソシアティブは格納位置を拡張する。

ダイレクトマッピングの場合はあるメモリアドレスに収納している値は、キャッシュインデックスの一意の場所に特定される。
メモリアドレス 1に入っているデータは、必ずキャッシュインデックスの1に格納される。

セットアソシアティブの場合は、メモリアドレス 1に入っているデータはキャッシュインデックスの1 or 2に格納される。これを2 way セットアソシアティブという。つまりメモリアドレスに対して、2つの格納できるキャッシュが存在するということ。当然3way 4 wayも存在する。

https://www.google.com/search?q=セットアソシアティブ&sxsrf=AOaemvI4N8itAhNeyLBTbO4-PFXySd4WYg:1633048345952&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjXxL6U-6fzAhXFDt4KHedgCNMQ_AUoAXoECAEQAw&biw=1378&bih=707&dpr=2#imgrc=RDORlfObUDl3BM

bayamasabayamasa

ダイレクトマッピングだと、たまたま複数回使うメモリが1つでもかぶってた場合、そのミスを取り返す術はなく、毎回キャッシュの入れ替えが起きてしまう。(スラッシング)

そのためセットアソシアティブにより、キャッシュマッピングに余裕をもたせることで速度低下を妨げることを保証することができる。

ただway数が大きければフルアソシアティブの欠点である、全探索の速度低下やプロセッサチップの拡大のデメリットも被るため、その真ん中のいいとこ取りをする必要がある

bayamasabayamasa

ライトスルー、ライトバック
https://itmanabi.com/write-through-back/

bayamasabayamasa

ライトバックの場合、ダーティビットというものが存在する。
データがキャッシュにしか存在しないので、その値が書き換わってしまうと値がなくなってしまう。

そのため、キャッシュリプレイスが行われるタイミングでキャッシュに保存されている値をメモリに書き込む
これにより値の消失を防ぐ。

これはダーティビットと呼ばれるバリッドビットを持つことにより実現可能となる

bayamasabayamasa

キャッシュは命令も保持することができる。
命令のキャッシュをI-Cache、データのキャッシュをD-Cacheと呼ぶ

bayamasabayamasa

プログラマがキャッシュの恩恵を受ける方法は3つ

  1. ループに注目
  2. ストライド1でアクセスする
  3. ローカル変数をなるべく使うようにする
このスクラップは2021/10/03にクローズされました