Slide 1

Slide 1 text

長谷川智希 𝕏 @tomzoh 2024/06/22 PHPカンファレンス福岡2024 なぜキャッシュメモリは速いのか

Slide 2

Slide 2 text

2 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh http://www.dgcircus.com デジタルサーカス株式会社 副団長CTO ॴଐ ٕज़ΧϯϑΝϨϯεओ࠻ دߘɾஶॻ 来たれ!PHPer!We are hiring! 𝕏

Slide 3

Slide 3 text

3 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh ςοΫΧϯϑΝϨϯεӡӦࢀՃ ֤छϓϩάϥϜ։ൃ $16 ϨτϩήʔϜػ ిࢠ޻࡞ Ϗʔϧ αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜ ϥΠϑϫʔΫ 𝕏

Slide 4

Slide 4 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 4 なぜキャッシュメモリは速いのか

Slide 5

Slide 5 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 5 https://jp.quora.com/プログラマーですがなぜキャッシュメモリは早いの

Slide 6

Slide 6 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 6 このお話は初心者向けのお話です わかりやすさ優先で一部話を単純化しています Disclaimer: 疑問・質問などはAsk the Speakerや懇親会でぜひ!

Slide 7

Slide 7 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 7 なぜキャッシュメモリは速いのか

Slide 8

Slide 8 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか キャッシュメモリって何? 8

Slide 9

Slide 9 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか キャッシュメモリ?キャッシュ? • キャッシュメモリ、という言葉は2つのワードからできている • キャッシュ + メモリ • キャッシュファイル、とかもありますよね 9

Slide 10

Slide 10 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか キャッシュって何? • キャッシュと聞いてどんなものを想像しますか? • PHPのOPcache • Webのページキャッシュ (CDN: Varnish / Fastly / CloudFront) • ブラウザのキャッシュ • 趣味や業務で作っているシステムで重い処理の結果をファイルに保存しておくやつ • CPUのL1, L2, L3キャッシュ • どれも「何らかの理由で取得に時間がかかるデータを高速に取り寄せるため」 に使われている 10

Slide 11

Slide 11 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか いろいろなキャッシュ(1) • PHPのOPcache • PHPソースコードからopcodeへのコンパイルに時間がかかるのでコンパイル結果を保 存しておいて変更がなければ保存したコンパイル結果を使う • Webのページキャッシュ (CDN: Varnish / Fastly / CloudFront) • Webページ(HTML)を組み立てるのに時間がかかるのでHTMLを保存しておいて同じペ ージなら保存したHTMLを返す 11

Slide 12

Slide 12 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか いろいろなキャッシュ(2) • ブラウザのキャッシュ • ネットワーク経由でファイルを取得するのに時間がかかるので取得したファイルをローカ ルに保存しておいて同じファイルへのリクエストなら保存したファイルを使う • CPUのキャッシュ • メインメモリからデータを取得するのに時間がかかるので • 取得した値を高速なメモリ(=キャッシュメモリ)に保存しておいて • 次に同じ場所からデータを取得する時はキャッシュメモリから取得する 12

Slide 13

Slide 13 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 2種類のキャッシュ • キャッシュは「何が遅いか」「何をバイパスするためか」によって2種類ある • OPcache, ページキャッシュは元データをコネコネした結果が保存されている = コネコネが遅い • ブラウザのキャッシュやCPUのキャッシュは元のデータとまったく同じデータが キャッシュに保存されている = 伝送経路か元のデータ供給が遅い 13

Slide 14

Slide 14 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 2種類のキャッシュの共通項 • 種類の違いはともあれ • キャッシュ = 何らかの理由で取得に時間がかかるデータを高速に取り寄せるためのもの • なので… 14

Slide 15

Slide 15 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 15 Q なぜキャッシュメモリは速いのか A 速くないとキャッシュメモリとして 用をなさないから ׬

Slide 16

Slide 16 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか だけど 16

Slide 17

Slide 17 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 17 https://jp.quora.com/プログラマーですがなぜキャッシュメモリは早いの

Slide 18

Slide 18 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 体系的な理解を求めて • ある程度わかってくるとコンピュータサイエンスの体系的な知識が欲しくなる • パタヘネとか読む…? 学校に行く…? • そこに体系的な知識はある…? そもそも体系的な知識って何だろう?世の中に実在する? • みなさんが駆け出しエンジニアに「どのような順番で何を勉強していったらバック エンドからフロントエンドまで体系的に理解できますか?」と聞かれたら…? • 「IPAの試験は良いと思うけど、最終的には時間をかけていろいろ体験するしかないんじゃ ないかな」 「楽しめないとツライと思うよ。あいつら勉強を勉強と思っていないから。」 • コンピュータサイエンスについても 面白いと思える話を聞くことを繰り返して自分で体系化するしかないのでは? 18

Slide 19

Slide 19 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 少しこの話を深掘りしてみましょう 19 という訳で…

Slide 20

Slide 20 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 20 なぜキャッシュメモリは速いのか

Slide 21

Slide 21 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか CPUはメモリアクセスマシン • CPUは「メインメモリから命令を読み出してその命令を実行する」を ひたすら繰り返す装置 • 「命令を実行」には「メインメモリからデータを読み出す」「書き出す」も含まれる • CPUはひたすらメインメモリを読んだり書いたりする装置 • 計算が速くできてもメインメモリから命令やデータを読み出すのが遅ければ 意味が無い • 現代のCPUのボトルネックはメモリアクセス 21

Slide 22

Slide 22 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか メモリアクセスの高速化 • メモリアクセスがCPUのボトルネックになることはわかった • メモリアクセスを速くする2つの方法 • データ供給を速くする: 高速なメモリを使う • 伝送路を速くする: メモリをCPUの近くに置く 22

Slide 23

Slide 23 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 高速なメモリを使う 23 メモリアクセスの高速化

Slide 24

Slide 24 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか そもそもメモリって? • メモリは電気的にデータ(1か0)を保持する装置(メモリセル)の集合体 • メモリセルは大きく分けて2つの構造がある • SRAMとDRAM • 速いRAMと遅いRAM 24

Slide 25

Slide 25 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか SRAMとDRAMのしくみ • SRAM - Static RAM • トランジスタでデータを保存し、 電源ある限りデータを保持できる • 速度が速い / トランジスタ数が多い • DRAM - Dynamic RAM • コンデンサ(充電池みたいなもの)に電荷をチャージしてデータを保存する • 1を読み込むと電荷が無くなって0になっちゃう(ので読み込んだ後に再度書き込みが必要) • 1を書き込んでもしばらく時間がたつと0になっちゃう(ので定期的に再書き込みが必要) • 速度が遅い / トランジスタ数が少ない 25 DRAM トランジスタ 1つ https://www.paltek.co.jp/techblog/techinfo/201020-1 SRAM トランジスタ 4つ

Slide 26

Slide 26 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか SRAMとDRAMの使い分け • トランジスタ数 = 価格・面積 • トランジスタ数が増えれば1bitあたりの単価が高くなる • 実装面積も増える • 容量優先のメインメモリにはDRAM,速度優先のキャッシュメモリにはSRAMが使われる • SDRAMとかDDR5とかLPDRAMとかも全部DRAM • CPUに内蔵されたキャッシュメモリは全部SRAM(だと思う) • ファミコンとかスーパーファミコンとかゲームボーイのバッテリーバックアップもSRAM • SRAMには低消費電力という利点もある • 最近のそれ系用途にはフラッシュメモリが使われる / データ保持に電力不要 26

Slide 27

Slide 27 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 高速なメモリを使う 27 メモリアクセスの高速化

Slide 28

Slide 28 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか CPUの近くに置く 28 メモリアクセスの高速化

Slide 29

Slide 29 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 配線長の問題 • CPUとメモリは物理的に配線されている • 64bit CPUなら64本の線がCPUとメモリの間を結んでいる 29 https://www.intel.co.jp/content/www/jp/ja/support/articles/000005670/processors.html https://amzn.to/4cq1xrB

Slide 30

Slide 30 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか パラレル接続の弱点 • CPUとメモリ間は多数の配線が並行に結ばれているのでパラレル接続という • 1本の場合はシリアル接続 • USB(= Universal Serial Bus)はシリアル • パラレル接続は長距離の高速通信が難しい • 配線の長さが違うとビット単位で通信先への到着タイミングが変わる • 高速通信する配線が隣り合ってると干渉して通信が安定しない 30

Slide 31

Slide 31 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 31 ഑ઢ௕Λ ௐ੔ͯ͠Δ

Slide 32

Slide 32 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 高速なメモリを使う 32 メモリアクセスの高速化 CPUの近くに置く

Slide 33

Slide 33 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 33 なぜキャッシュメモリは速いのか

Slide 34

Slide 34 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか キャッシュメモリ • CPUのボトルネックはメモリアクセス → メモリアクセスを高速化したい • メインメモリは高速にしづらい • メインメモリは大容量が求められるがCPUの近くに置けるメモリ量は限られる(面積の制約) • メインメモリはコンピュータの用途によって必要量が違い、モジュールで拡張可能にしたい (= 遠くに置きたい) • CPUの近くに高速なメモリを置いて良く使うデータをコピーして使う • これがキャッシュメモリ • 一番近いところに置きたいのでCPU内に置くのが一般的 • 関連ワード: データの局所性 34

Slide 35

Slide 35 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: CPU処理装置の利用率向上 • メモリアクセスを待っているとCPUの処理装置(演算器とか)がヒマ • キャッシュメモリを導入 → メモリアクセスを待たない = CPU処理装置の利用率を上げて高速化 • 現在のCPUの高速化の多くは処理装置の利用率向上で実現されている • キャッシュ, パイプライン, 分岐予測, ハイパースレッディング, SIMD, ダークシリコン… 35

Slide 36

Slide 36 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか まとめ キャッシュメモリとは何か • メインメモリから取得したデータを保存しておいて 次に同じ場所からデータを取得する時に高速に取得できる様にするためのメモリ なぜキャッシュメモリを使用するのか • CPUの動作のボトルネックであるメインメモリアクセスを速くするため キャッシュメモリはメインメモリと何が違うのか • 速い / 少量 / CPUコアの近くに配置されている 結局なぜキャッシュメモリは速いのか • 速くないとキャッシュメモリとして用をなさないから • 速いメモリ(SRAM)がCPUコアの近くに配置されているから 36

Slide 37

Slide 37 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか おわりに • このタイプの話がお好きだったら関連ワードについて調べてみたり、 「コンピュータの構成と設計」(パタヘネ)とか読んでみたりしても良いかも (「体系的?」「面白い?」と言われると「う〜ん?」なのですがテーマとしては網羅されている) • アプリケーション的なキャッシュについてはまたの機会に…。 • コンピュータサイエンスを楽しみましょう! 37 パイプライン, 分岐予測, ハイパースレッディング, SIMD, ダークシリコン, Spectre/Meltdown 関連ワード There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton https://www.martinfowler.com/bliki/TwoHardThings.html

Slide 38

Slide 38 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 38

Slide 39

Slide 39 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか おまけ 39

Slide 40

Slide 40 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: cache 40

Slide 41

Slide 41 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: 多段キャッシュ • CPUのキャッシュは多段になっていることが多い • L1, L2, L3: Layer 1, 2, 3 • CPUコアから近い順に L1, L2, L3 • サイズは L1 < L2 < L3 • 速度は L1 > L2 > L3 • コア間での共有の違い: 異なる局所性のカバー • 構成はCPUによって違う • Intel CPU: L1, L2は各CPUコアに内蔵されて専有, L3はCPUコア間で共有 • Apple Silicon: L1は各CPUコアに内蔵されて専有, L2はCPUコア間で共有 41

Slide 42

Slide 42 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: CPUのボトルネックの変遷 • メモリがボトルネックになるのは現代のCPUの話 • 1980年代のCPUは命令の処理速度がボトルネックだった • 命令の処理速度が上がりメモリ速度がボトルネックになったので キャッシュが重要になった 42

Slide 43

Slide 43 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: CPUの脆弱性 Spectre / Meltdown • 2018年初頭に話題になったCPU脆弱性 Spectre / Meltdown • 本来読み込めてはいけないメモリ領域を読み込めてしまう(サイドチャネル攻撃) • とても衝撃的だった • キャッシュ、パイプライン、分岐予測といった現代のCPU高速化の基礎となる技 術に対する攻撃 • 根本的な解決をするためにはキャッシュ、パイプライン、分岐予測に手を入れる必要がある • 最近のIntel CPUでハイパースレッディング(1コア内で2コア分の命令実行をする技術)が廃 止されたのはこのタイプの攻撃への対策では…との話もある 43

Slide 44

Slide 44 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか Apple Siliconのキャッシュ 44 https://gigazine.net/news/20211026-apple-m1-pro-max/ $16ίΞʢߴੑೳʣ ಺෦ʹ-Ωϟογϡ,# ʢ໋ྩ,# σʔλ,#ʣ -Ωϟογϡ.# ߴੑೳίΞ಺Ͱڞ༗

Slide 45

Slide 45 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: Apple Siliconのチートなところ 45 $16ʹϝΠϯϝϞϦ΋಺ଂ͍ͯ͠Δ ͍ۙߴ଎Խ͠΍͍͢ ௒ύϥϨϧ઀ଓCJU(#T ΩϟογϡϝϞϦ 43"..# ԯτϥϯδελ ϝΠϯϝϞϦ %3".(#

Slide 46

Slide 46 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: Apple Siliconのコアのネーミング 46 https://gigazine.net/news/20211026-apple-m1-pro-max/ $16ίΞʢߴੑೳʣ 'JSFTPUSN $16ίΞʢߴޮ཰ʣ *DFTUPSN 厨二心に…響く…

Slide 47

Slide 47 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: キャッシュメモリの動作 • CPUがメインメモリからデータを読み込む • 読み込んだデータはキャッシュに保存 • 次に同じアドレスからデータを読み込む時はキャッシュから読み込む • CPUがデータをメモリに書き込む • メモリに書き込んでキャッシュを破棄する • メモリとキャッシュに書き込む (ライトスルー) • キャッシュにしか書き込まないでメインメモリにはあとでまとめて書き込む (ライトバック) 47

Slide 48

Slide 48 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: 命令キャッシュとデータキャッシュ • Apple Silicon M1 Pro のCPUコア(高性能)のL1キャッシュは320KB • これは命令192KB, データ128KBの合算 • 内部ハーバードアーキテクチャ • 命令用メモリとデータ用メモリを別に扱うアーキテクチャ • 初期のコンピュータ Harvard Mark I で使われたアーキテクチャ • ガチのハーバードアキテクチャはメインメモリも命令用とデータ用がある • 命令とデータはメモリアクセスパターンが違う • それぞれに局所性がある • 命令は(普通は)書き換えが発生しない 48

Slide 49

Slide 49 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: 外付けキャッシュモジュール 49 https://jp.mercari.com/item/m54957367508 $161PXFS1$.)[ ϝΠϯϝϞϦ.# 04.BD04 .BDJOUPTI1FSGPSNB

Slide 50

Slide 50 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: RAM • RAMはメモリの一種 • メインメモリとかキャッシュメモリとか • 読み書き可能で比較的高速なメモリ • メモリは他にもいろいろある • ROMとかフラッシュメモリとか磁気メモリとかバブルメモリとか • 情報を記憶するデバイスで基板上に固定されてるやつをメモリと呼びそう…? • そういう意味ではSSDとかHDDもメモリだけどあまりメモリとは言わないな…。 • ディスク感(?)あるものはディスクって言うね…。 50

Slide 51

Slide 51 text

長谷川智希 @tomzoh なぜキャッシュメモリは速いのか 余談: パラレルの時代からシリアルの時代へ • 昔はプリンタとかパラレルポートだったけど今はUSBになったりしてる。 • USB = Universal Serial Bus • パラレル8本→シリアル1本とすると通信速度1/8だけど、 シリアル化により8倍以上稼げる 51