SlideShare a Scribd company logo
1 of 43
Download to read offline
あなたのお家に届くまで 
CPUキャッシュアーキテクチャ入門(その1) 
! 
Dora. Panda October 18th, 2014
今日のお題 
CPUがデータを読み込むまで 
の長い長いお話です。 
ソフトウェアからは見ること 
のできないCPU内部動作につ 
いて説明します。
ハードウェア構成 
左図の構成で説明を進めます 
CPUによって実装が異なるので、機種 
固有の説明は省きます。 
私なりに考えた「キャッシュの基礎を 
理解する」ための仮想CPUです。 
「そこそこ」ワーストケースで考えます。 
TLBヒット、L1、L2キャッシュはミス 
ヒット。 
細かい用語は後ほど。 
Processor Chip 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache
メモリからロードしてみよう 
例えば、以下のC言語プログラ 
ム上は左の赤枠のような命令 
に置き換えられます。 
int hoge = *__bss_start__; 
! 
※ARM命令の場合
“Le plus important est invisible” 
“大切な物は目に見えないんだよ” 
–The Little Prince 
メモリからデータを読み出し、CPUレジスタにロードされるまで 
長い旅路の物語
と、その前に…レジスタって? 
パソコン初心者向け説明 
CPUはメモリに情報を置く 
メモリに入りきらないとき 
はHDDに退避 
CPU 
DRAM HDD
レジスタ=CPU内部のメモリ領域 
CPUはレジスタのデータに対して 
のみ演算可能。 
メモリの値を直接制御できない。 
データ読み出しはメモリからレ 
ジスタに転送し、レジスタを読 
む。 
データ書き込みはレジスタに書 
き、レジスタの内容をメモリに 
転送する。 
CPU 
演算回路 
レレジジススタタ 
キャッシュ 
DRAM HDD
About MMU Processor Chip 
MEMORY 
MANAGEMENT 
UNIT 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache
MMU 
CPUがデータをロードすると 
き、MMUに対してアドレスを 
出力します。 
MMUでは仮想メモリと物理メ 
モリ変換を行います。 
TLBというアドレス変換情報 
キャッシュがあります。 
CPU Core 
仮想アドレス 
MMU 
仮想アドレス物理アドレス 
仮想アドレス物理アドレス 
仮想アドレス物理アドレス 
仮想アドレス物理アドレス 
物理アドレス
物理アドレスと仮想アドレス 
物理アドレス 
連続的な実際のアドレス。 
仮想アドレス 
OSが実行時に動的に割り当てるアドレス 
ページ単位の割り当て 
4kB、16kB、64kBなど。 
不連続なページを連続的に見せる。 
プロセス毎に独立したアドレス 
あるプロセスからほかのプロセスのアドレ 
スにはアクセス不可。(メモリ保護) 
物理アドレス仮想アドレス
仮想~物理アドレス変換 
MMU 
仮想アドレス(32bit) 
00000000000 00000000000 000000000000 
Page Table 
物理アドレス 
物理アドレス(32bit) 
00000000000000000000 000000000000 
Page Table 
Page Table 
Page Table 
Page Table 
物理アドレス 
物理アドレス 
物理アドレス 
Page Table Entry(PTE)を使ってアドレ 
ス変換 
TLBはPTEのキャッシュ 
TLBミスヒット時はPTEを検索 
エントリ数は32~128個程度 
PTEミスヒット時はページイン(Disk 
-> RAM)
About Level 1 Cache Processor 
LEVEL 1 CACHE 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache
LEVEL 1 CACHE 
CPUが最初にアクセスするメ 
モリ領域 
一番高速&一番サイズが小さ 
いメモリ 
CPUクロックと同一クロッ 
クで読み書き可能 
数k~数100kBytes程度 
MMU 
物理アドレス 
Level 1 Cache 
物理アドレスデータ 
物理アドレスデータ 
物理アドレスデータ 
物理アドレスデータ 
Miss Hit Hit
DETAILS OF CACHE 
アドレス 
00000000000000000 000000000 000000 
Level 1 Cache 
1 word (4bytes) 
データ(1 word) 
Cache Entry Table 
タグ(上位アドレス) データ 
タグ(上位アドレス) データ 
タグ(上位アドレス) データ 
タグ(上位アドレス) データ 
00000000 00000000 00000000 00000000 
=? 
データ1 
データ2 
データ3 
データn ① 
② 
③ 
01 
511
CACHE ALGORITHM 
~キャッシュの動作をC/C++で表現してみました~ 
typedef struct { 
unsigned long tag; 
int data[8]; 
} CLine; 
! 
typedef struct { 
CLine entry[512 / (8 * sizeof(int)]; // 16 line 
} ETable; 
ETable cache; 
! 
bool GetData(int* adrs, int *data) { 
unsigned long i = (adrs & 0x000001E0) >> 5; 
! 
if (cache.entry[i].tag == adrs & 0xFFFFFE00) { 
*data = cache.entry[i].data[adrs & 0x0000001F]; 
} 
キャッシュ 
:512バイト 
ラインあたりのワード数 
:8ワード 
ライン数 
:16ライン
CACHE ALGORITHM 
typedef struct { 
unsigned long tag; 
int data[8]; 
} CLine; 
! 
typedef struct { 
CLine entry[512 / (8 * sizeof(int)]; 
} ETable; 
ETable cache; 
! 
bool GetData(int* adrs, int *data) { 
unsigned long i = (adrs & 0x000001E0) >> 5; 
! 
if (cache.entry[i].tag == adrs & 0xFFFFFE00) { 
*data = cache.entry[i].data[adrs & 0x0000001F]; 
} 
・タグ 
:0xFFFFFE00 
・インデックス 
:0x000001E0 
・ライン内オフセット 
:0x0000001F 
アドレスからインデックスを抽出
CACHE ALGORITHM 
typedef struct { 
unsigned long tag; 
int data[8]; 
} CLine; 
! 
typedef struct { 
CLine entry[512 / (8 * sizeof(int)]; 
} ETable; 
ETable cache; 
! 
bool GetData(int* adrs, int *data) { 
unsigned long i = (adrs & 0x000001E0) >> 5; 
! 
if (cache.entry[i].tag == adrs & 0xFFFFFE00) { 
*data = cache.entry[i].data[adrs & 0x0000001F]; 
} 
・タグ 
:0xFFFFFE00 
・インデックス 
:0x000001E0 
・ライン内オフセット 
:0x0000001F 
アドレスからタグを抽出して比較
CACHE ALGORITHM 
typedef struct { 
unsigned long tag; 
int data[8]; 
} CLine; 
! 
typedef struct { 
CLine entry[512 / (8 * sizeof(int)]; 
} ETable; 
ETable cache; 
! 
bool GetData(int* adrs, int *data) { 
unsigned long i = (adrs & 0x000001E0) >> 5; 
! 
if (cache.entry[i].tag == adrs & 0xFFFFFE00) { 
*data = cache.entry[i].data[adrs & 0x0000001F]; 
} 
・タグ 
:0xFFFFFE00 
・インデックス 
:0x000001E0 
・ライン内オフセット 
:0x0000001F 
アドレスからライン内オフセットを抽出 
↑ここはちょっと変だけど許してね
N-WAY ASSOCIATEVE CACHE 
Cache Entry Table 
Cache Entry Table 
Cache Entry Table 
Cache Entry Table 
タグ(上位アドレス) データ 
タグ(上位アドレス) データ 
タグ(上位アドレス) データ 
タグ(上位アドレス) データ 
nウェイアソシアティブ 
キャッシュを複数(n)毎持つ 
ダイレクトマップの欠点を解決 
同一インデックスに対して 
複数エントリを持つことで 
ヒット率向上。 
アドレス 
000000000000000000 000000000 00000 
=? 
Hit or Miss ?
MISS HIT! 
キャッシュ内のデータをライトバック 
データを読み込むためのキャッシュ 
エントリを確保するため。 
LRU/ランダム/ラウンドロビン 
L2キャッシュから読み出し 
読み出し終わるまでCPUはストール 
(パイプライン完全停止) 
Level 1 Cache 
物理アドレスデータ 
物理アドレスデータ 
物理アドレスデータ 
物理アドレスデータ 
L2 Cache
About Level 2 Cache Processor 
LEVEL 2 CACHE 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache
LEVEL2 CACHE SEQUENCE 
Address 
確定 
Tag 
出力 
比較 
Data 
出力 
確定 
Bus Clock 
L1 Cacheがアドレスを出力 
L2 cacheがアドレスを確定 
Tag読み出し制御 
Tagが出力される 
Tag比較 -> Hit ! 
Data読み出し制御 
Dataが出力される 
L1 Cacheへデータを返す 
読み出しに8 Clock必要
About DRAM Processor 
DYNAMIC 
RANDOM 
ACCESS 
MEMORY 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache
外部デバイスアクセス 
DRAMは外部デバイス 
制御用のHWが必要 
非常に低速 
CPUクロックの5~10分の1
10 Clock@8wordバーストリード(キャッシュ1ラインフィルに相当) 
DDR3-SDRAM READ TIMING 
参考資料: 
http://www.samsung.com/global/business/semiconductor/file/product/ddr3_device_operation_timing_diagram_rev121.pdf
DDR3-SDRAM STATE CHART 
DDR3-SDRAMの内部状態遷移図 
HW IPとして提供されることが多 
いのでこれを理解している人は少 
ないと思います。 
重要キーワード 
ModeRegister 
プリチャージ 
リフレッシュ
DRAMとキャッシュ 
DRAMはキャッシュに接続され 
る前提で機能実装 
ラインフィルに必要なバース 
トモード 
全てシングルアクセスする 
と致命的に遅い 
要求されたデータから順にリー 
ド可能 
Single Word Read = 7 Clock/Word 
8 Words Burst Read = 1.25 Clock/Word 
(10 Clock / 8 Words) 
DRAMとキャッシュは密接な関係にあります
Consideration Processor 
ヒット率と 
アクセス時間に 
関する考察 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache 
?
CPUの待ち時間 
今までのワーストケースで1wordを読み出す時間を計算 
tL1 = 1 Clock 
tL2 = 16 Clock (8 × 2CPUの半分のクロックで動作と過程) 
tDDR3 = 28 Clock (7 × 4 CPUバスの半分のクロックで動作と過程) 
tAllMiss = tL1 + tL2 + tDDR3 = 45 [Clock] 
CPUやシステムによって上記の値は全然違います。 
実際の値を適用すると、もっとすごいことになります。 
http://www.7-cpu.com/cpu/Cortex-A9.html
キャッシュヒット率を考慮 
キャッシュヒット率(仮定) 
L1、L2ともにhit率 = 90.0%と仮定。 
Avarage Access Time = tL1×0.9 + tL2 × (1 - 0.9) + tDDR3 × (1 - 
0.9) × 0.9 = 4.22[clock] 
バスクロックが遅いと? 
同一クロックであっても外部バス速度が遅いCPUがあります。 
例:Core2Duo 667MHz、Celeron 533MHz 
Avarage Access Time = tL1×0.9 + (tL2 × (1 - 0.9) + tDDR3 × (1 - 
0.9) × 0.9) × 667/533 = 5.05[clock] 
ざっくり計算です。
キャッシュやメモリ制御回路が 
大部分を占めます。
Study Processor 
実験してみよう 
CPU Core 
L2 Cache 
Mem Ctrl 
DRAM 
HW… 
PCIe 
MMU 
L1 Cache 
?
Intel Performance Counter Monitorで実験してみましょう。 
通常のループ 
残念なループ 
ブロッキング 
アンローリング 
行列計算 
フォールスシェアリング
通常のループ 
src[row] += dst[row][col] 
dstのサイズ>>キャッシュ 
キャッシュ1ラインのワード数 
ごとにキャッシュミスヒット。 
row 
0 
1 
src 
9 
row col 
0 0 
1 
dst 
65535 
1 0 
9 65534 
9 65535 
キャッシュ 
サイズ 
for (unsigned long row = 0; row < ROW_SIZE; row++) { 
for (unsigned long col = 0; col < COL_SIZE; col++) { 
*(dst + row) += *(src + row * COL_SIZE + col); 
} 
}
残念なループ 
rowのインクリメントを先にする。 
インクリメント>>キャッシュ 
毎回ミスヒットする。 
row 
0 
1 
src 
9 
row col 
0 0 
1 
dst 
65535 
1 0 
9 65534 
9 65535 
キャッシュ 
サイズ 
for (int col = 0; col < COL_SIZE; col++) { 
for (int row = 0; row < ROW_SIZE; row++) { 
*(dst + row) += *(src + row * COL_SIZE + col); 
} 
}
ブロッキング 
キャッシュサイズの範囲内で 
一通り処理する。 
終わったら次の領域に移る。 
ミスヒットが格段に減る。 
row 
0 
1 
src 
9 
row col 
0 0 
1 
dst 
65535 
1 0 
9 65534 
9 65535 
キャッシュ 
サイズ 
for (int Blk = 0; Blk < COL_SIZE; Blk += BLKSIZE) { 
for (int row = 0; row < ROW_SIZE; row++) { 
for (int col = Blk; col < Blk + BLKSIZE; col++) { 
*(dst + row) += *(src + Blk * BLKSIZE + col); 
} 
} 
} 
ブロック 
サイズ
ループアンローリング 
ループ処理を展開して分岐命 
令を削減 
展開しすぎるとプログラム 
が大きくなり、命令キャッ 
シュミスが増える 
for (unsigned long row = 0; row < ROW_SIZE; row++) { 
for (unsigned long col = 0; col < COL_SIZE;) { 
*(data_dst + row) += *(data_src + row * COL_SIZE + col++); 
*(data_dst + row) += *(data_src + row * COL_SIZE + col++); 
*(data_dst + row) += *(data_src + row * COL_SIZE + col++); 
…略… 
*(data_dst + row) += *(data_src + row * COL_SIZE + col++); 
} 
} 
処理 
インクリメント 
分岐判定 
処理 
インクリメント 
分岐判定 
処理 
インクリメント 
分岐判定 
処理 
インクリメント 
処理 
インクリメント 
処理 
インクリメント 
… 
… 
実行命令数が減る 
=処理時間も減る 
プログラムサイズは 
増える
行列計算 
普通にアルゴリズムを書くと、先ほどの「普通のループ」 
と「残念なループ」の組み合わせになる。 
片方をわざと行列を入れ替えて定義する 
int A[row][col]; 
int B[col]row]; 
int A[row][col]; 
int B[row][col];
フォールスシェアリング 
複数のスレッドが同一キャッシュラインのデータにライト 
アクセスするときに発生し得る問題。 
Core1 Core2 
Cache Line Cache Line 
DRAM 
Core 1とCore2は異なるアドレスにライトする。 
アドレスは異なるが、キャッシュラインは同一。 
Core1がデータを書き換える。 
他コアもキャッシュしているため、DRAMにライトバック。 
Core2はDRAMとキャッシュが不一致のため、キャッシュさ 
れていたデータは「無効(データ無し)」とする。 
Core2がデータを書き換える。 
ミスヒットが発生し、DRAMからデータを読み出す。
フォールスシェアリング解決策 
複数のスレッドで共有する必要の無いデータはアドレスが 
64バイト以上離れるようにする。 
Core1 Core2 
Cache Line Cache Line 
DRAM 
void worker_thread1(void) { 
for (int i = 0; i < MAX; i++) 
dstArea[0] += srcArea[i]; 
} 
! 
void worker_thread2(void) { 
for (int i = 0; i < MAX; i++) 
dstArea[1] += srcArea[i]; 
} 
! 
void worker_thread3(void) { 
for (int i = 0; i < MAX; i++) 
dstArea[64] += srcArea[i]; 
} 
thread1と2はフォールスシェアリング 
thread1と3は無し
実験結果:ループ 
「残念なループ」はキャッシュヒッ 
ト率が低く、DRAMアクセスが多 
い。 
「ブロッキング」はDRAMアクセ 
スが少ない。 
簡単なプログラムのため差が 
出にくかったかも。 
テストプログラム以外のプロセ 
スのカウント値も含まれてい 
ると思われます。 
時間L1 HIT DRAM 
READ 
普通1.68 99.82 5542MB 
残念14.09 89.54 41100MB 
ブロッキ 
ング1.63 99.95 283MB 
アンロー 
リング1.62 99.91 5460MB
実験結果:行列計算/シェアリング 
行列を入れ替えるとキャッシュ 
ヒット率が向上しDRAMアクセ 
スが減る。 
フォールスシェアリングを回避 
することによりDRAMアクセス 
が半分になっている。 
「ループ」、「行列計算」、 
「シェアリング」はそれぞ 
れ異なるテストプログラムを 
実行しています。 
時間L1 HIT DRAM 
READ 
通常13.33 92.30 49.8GB 
行列 
入れ替え2.06 99.75 10.7GB 
時間L1 HIT DRAM 
READ 
FALSE 
SHARE 10.54 95.42 926MB 
NONE 
SHARED 4.62 98.77 421MB
参考資料 
アーキテクチャ全般 
David A.Patterson/John L.Hennessy; パターソン&ヘネシー コンピュータの構成と設計 第4版, 
日経BP社, 2011年. 
中森 章; マイクロプロセッサ・アーキテクチャ入門, CQ出版, 2004年. 
CPU実例 
ARM 
Cortex-A9 テクニカルリファレンスマニュアル, r2p2 
CoreLink Level 2 Cache Controller L2C-310 Technical Reference Manual, r3p3 
Intel 
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System 
Programming Guide, Part 1 
Intel® 64 and IA-32 Architectures Optimization Reference Manual 
Performance Analysis Guide for Intel® Core™ i7 Processor and Intel® Xeon™ 5500 
processors

More Related Content

What's hot

スペシャリストになるには
スペシャリストになるにはスペシャリストになるには
スペシャリストになるには外道 父
 
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)Shota Shinogi
 
How shit works: the CPU
How shit works: the CPUHow shit works: the CPU
How shit works: the CPUTomer Gabel
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesYohei Azekatsu
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料SECCON Beginners
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
IocコンテナについてAkio Terayama
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!デベロッパーネットワーク
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料SECCON Beginners
 
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!Kohei Tokunaga
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いRetrieva inc.
 
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~Hiroshi Tokumaru
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Moving computation to the data (1)
Moving computation to the data (1)Moving computation to the data (1)
Moving computation to the data (1)Kazunori Sato
 
OWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみよう
OWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみようOWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみよう
OWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみようOWASP Nagoya
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいwata2ki
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ UndertowについてYoshimasa Tanabe
 
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略祐司 伊藤
 
RedisConf17- durable_rules
RedisConf17- durable_rulesRedisConf17- durable_rules
RedisConf17- durable_rulesRedis Labs
 

What's hot (20)

スペシャリストになるには
スペシャリストになるにはスペシャリストになるには
スペシャリストになるには
 
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
 
How shit works: the CPU
How shit works: the CPUHow shit works: the CPU
How shit works: the CPU
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
 
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Moving computation to the data (1)
Moving computation to the data (1)Moving computation to the data (1)
Moving computation to the data (1)
 
OWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみよう
OWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみようOWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみよう
OWASP ISVS を使って IoT エコシステムのセキュリティについて考えてみよう
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
 
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
 
RedisConf17- durable_rules
RedisConf17- durable_rulesRedisConf17- durable_rules
RedisConf17- durable_rules
 

Viewers also liked

2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調智啓 出川
 
便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出Toshiyuki Shimono
 
確率論基礎
確率論基礎確率論基礎
確率論基礎hoxo_m
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Inc.
 
H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1Kenichi Takara
 
統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?Yuto Suzuki
 
経験過程
経験過程経験過程
経験過程hoxo_m
 
EthernetやCPUなどの話
EthernetやCPUなどの話EthernetやCPUなどの話
EthernetやCPUなどの話Takanori Sejima
 
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開verHirotaka Nishimiya
 
「数学の世界」発表資料
「数学の世界」発表資料「数学の世界」発表資料
「数学の世界」発表資料spdbear
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法NAOKI ABE
 
MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)Shinichi Tamura
 
カップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみたカップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみたhoxo_m
 
ベイズ基本0425
ベイズ基本0425ベイズ基本0425
ベイズ基本0425asato kuno
 
TensorFlowで学ぶDQN
TensorFlowで学ぶDQNTensorFlowで学ぶDQN
TensorFlowで学ぶDQNEtsuji Nakai
 
ベイズ統計入門
ベイズ統計入門ベイズ統計入門
ベイズ統計入門Miyoshi Yuya
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat StorageEtsuji Nakai
 

Viewers also liked (20)

2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
 
便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出
 
確率論基礎
確率論基礎確率論基礎
確率論基礎
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説
 
H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1
 
統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?
 
Life with jupyter
Life with jupyterLife with jupyter
Life with jupyter
 
経験過程
経験過程経験過程
経験過程
 
EthernetやCPUなどの話
EthernetやCPUなどの話EthernetやCPUなどの話
EthernetやCPUなどの話
 
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
 
「数学の世界」発表資料
「数学の世界」発表資料「数学の世界」発表資料
「数学の世界」発表資料
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法
 
MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)
 
カップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみたカップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみた
 
ベイズ基本0425
ベイズ基本0425ベイズ基本0425
ベイズ基本0425
 
TensorFlowで学ぶDQN
TensorFlowで学ぶDQNTensorFlowで学ぶDQN
TensorFlowで学ぶDQN
 
ベイズ統計入門
ベイズ統計入門ベイズ統計入門
ベイズ統計入門
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
 
Code jp2015 cpuの話
Code jp2015 cpuの話Code jp2015 cpuの話
Code jp2015 cpuの話
 

Similar to Cpu cache arch

HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golfNomura Yusuke
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?Yohei Azekatsu
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介Satoshi Hirata
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflowionis111
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureRyota Watabe
 
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきことmao999
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向shigeki_ohtsu
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)Hiro H.
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 

Similar to Cpu cache arch (20)

HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
Boost Tour 1.53.0 merge
Boost Tour 1.53.0 mergeBoost Tour 1.53.0 merge
Boost Tour 1.53.0 merge
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golf
 
HTTP/2, QUIC入門
HTTP/2, QUIC入門HTTP/2, QUIC入門
HTTP/2, QUIC入門
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
 
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 

Recently uploaded

キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~
キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~
キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~honeshabri
 
The 86th National Convention of IPSJ (Student Encouragement Award))
The 86th National Convention of IPSJ (Student Encouragement Award))The 86th National Convention of IPSJ (Student Encouragement Award))
The 86th National Convention of IPSJ (Student Encouragement Award))yoshidakids7
 
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。iPride Co., Ltd.
 
チームで開発するための環境を整える
チームで開発するための環境を整えるチームで開発するための環境を整える
チームで開発するための環境を整えるonozaty
 
JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜
JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜
JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜Naomi Yamasaki
 
IGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdf
IGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdfIGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdf
IGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdfIGDA Japan SIG-Audio
 
これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024Hideki Saito
 
SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」
SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」
SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」IGDA Japan SIG-Audio
 
AWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作りAWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作りiPride Co., Ltd.
 
00001_test_automation_portfolio_20240313
00001_test_automation_portfolio_2024031300001_test_automation_portfolio_20240313
00001_test_automation_portfolio_20240313ssuserf8ea02
 
バイオリンの運弓動作計測による初心者と経験者の差異分析
バイオリンの運弓動作計測による初心者と経験者の差異分析バイオリンの運弓動作計測による初心者と経験者の差異分析
バイオリンの運弓動作計測による初心者と経験者の差異分析sugiuralab
 
キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版
キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版
キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版Takayuki Nakayama
 

Recently uploaded (12)

キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~
キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~
キャラで動かすGPT ~GPTsでどんな感じに作っているとか考えていることとか~
 
The 86th National Convention of IPSJ (Student Encouragement Award))
The 86th National Convention of IPSJ (Student Encouragement Award))The 86th National Convention of IPSJ (Student Encouragement Award))
The 86th National Convention of IPSJ (Student Encouragement Award))
 
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
 
チームで開発するための環境を整える
チームで開発するための環境を整えるチームで開発するための環境を整える
チームで開発するための環境を整える
 
JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜
JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜
JAWS DAYS 2024 E-3 ランチにまつわるちょっといい話 〜給食がない町の小中学生に温かい昼食を〜
 
IGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdf
IGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdfIGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdf
IGDA Japan SIG Audio #22 オンラインセミナー VRの知る.pdf
 
これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024
 
SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」
SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」
SIG-AUDIO 2024 Vol.02 オンラインセミナー 「必殺使音人(ひっさつしおとにん)カットシーンを成敗せよ」
 
AWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作りAWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作り
 
00001_test_automation_portfolio_20240313
00001_test_automation_portfolio_2024031300001_test_automation_portfolio_20240313
00001_test_automation_portfolio_20240313
 
バイオリンの運弓動作計測による初心者と経験者の差異分析
バイオリンの運弓動作計測による初心者と経験者の差異分析バイオリンの運弓動作計測による初心者と経験者の差異分析
バイオリンの運弓動作計測による初心者と経験者の差異分析
 
キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版
キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版
キンドリル_ネットワーク自動化成熟度診断サービス ご紹介資料 2024年3月版
 

Cpu cache arch

  • 2. 今日のお題 CPUがデータを読み込むまで の長い長いお話です。 ソフトウェアからは見ること のできないCPU内部動作につ いて説明します。
  • 3. ハードウェア構成 左図の構成で説明を進めます CPUによって実装が異なるので、機種 固有の説明は省きます。 私なりに考えた「キャッシュの基礎を 理解する」ための仮想CPUです。 「そこそこ」ワーストケースで考えます。 TLBヒット、L1、L2キャッシュはミス ヒット。 細かい用語は後ほど。 Processor Chip CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache
  • 4. メモリからロードしてみよう 例えば、以下のC言語プログラ ム上は左の赤枠のような命令 に置き換えられます。 int hoge = *__bss_start__; ! ※ARM命令の場合
  • 5. “Le plus important est invisible” “大切な物は目に見えないんだよ” –The Little Prince メモリからデータを読み出し、CPUレジスタにロードされるまで 長い旅路の物語
  • 7. レジスタ=CPU内部のメモリ領域 CPUはレジスタのデータに対して のみ演算可能。 メモリの値を直接制御できない。 データ読み出しはメモリからレ ジスタに転送し、レジスタを読 む。 データ書き込みはレジスタに書 き、レジスタの内容をメモリに 転送する。 CPU 演算回路 レレジジススタタ キャッシュ DRAM HDD
  • 8. About MMU Processor Chip MEMORY MANAGEMENT UNIT CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache
  • 9. MMU CPUがデータをロードすると き、MMUに対してアドレスを 出力します。 MMUでは仮想メモリと物理メ モリ変換を行います。 TLBというアドレス変換情報 キャッシュがあります。 CPU Core 仮想アドレス MMU 仮想アドレス物理アドレス 仮想アドレス物理アドレス 仮想アドレス物理アドレス 仮想アドレス物理アドレス 物理アドレス
  • 10. 物理アドレスと仮想アドレス 物理アドレス 連続的な実際のアドレス。 仮想アドレス OSが実行時に動的に割り当てるアドレス ページ単位の割り当て 4kB、16kB、64kBなど。 不連続なページを連続的に見せる。 プロセス毎に独立したアドレス あるプロセスからほかのプロセスのアドレ スにはアクセス不可。(メモリ保護) 物理アドレス仮想アドレス
  • 11. 仮想~物理アドレス変換 MMU 仮想アドレス(32bit) 00000000000 00000000000 000000000000 Page Table 物理アドレス 物理アドレス(32bit) 00000000000000000000 000000000000 Page Table Page Table Page Table Page Table 物理アドレス 物理アドレス 物理アドレス Page Table Entry(PTE)を使ってアドレ ス変換 TLBはPTEのキャッシュ TLBミスヒット時はPTEを検索 エントリ数は32~128個程度 PTEミスヒット時はページイン(Disk -> RAM)
  • 12. About Level 1 Cache Processor LEVEL 1 CACHE CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache
  • 13. LEVEL 1 CACHE CPUが最初にアクセスするメ モリ領域 一番高速&一番サイズが小さ いメモリ CPUクロックと同一クロッ クで読み書き可能 数k~数100kBytes程度 MMU 物理アドレス Level 1 Cache 物理アドレスデータ 物理アドレスデータ 物理アドレスデータ 物理アドレスデータ Miss Hit Hit
  • 14. DETAILS OF CACHE アドレス 00000000000000000 000000000 000000 Level 1 Cache 1 word (4bytes) データ(1 word) Cache Entry Table タグ(上位アドレス) データ タグ(上位アドレス) データ タグ(上位アドレス) データ タグ(上位アドレス) データ 00000000 00000000 00000000 00000000 =? データ1 データ2 データ3 データn ① ② ③ 01 511
  • 15. CACHE ALGORITHM ~キャッシュの動作をC/C++で表現してみました~ typedef struct { unsigned long tag; int data[8]; } CLine; ! typedef struct { CLine entry[512 / (8 * sizeof(int)]; // 16 line } ETable; ETable cache; ! bool GetData(int* adrs, int *data) { unsigned long i = (adrs & 0x000001E0) >> 5; ! if (cache.entry[i].tag == adrs & 0xFFFFFE00) { *data = cache.entry[i].data[adrs & 0x0000001F]; } キャッシュ :512バイト ラインあたりのワード数 :8ワード ライン数 :16ライン
  • 16. CACHE ALGORITHM typedef struct { unsigned long tag; int data[8]; } CLine; ! typedef struct { CLine entry[512 / (8 * sizeof(int)]; } ETable; ETable cache; ! bool GetData(int* adrs, int *data) { unsigned long i = (adrs & 0x000001E0) >> 5; ! if (cache.entry[i].tag == adrs & 0xFFFFFE00) { *data = cache.entry[i].data[adrs & 0x0000001F]; } ・タグ :0xFFFFFE00 ・インデックス :0x000001E0 ・ライン内オフセット :0x0000001F アドレスからインデックスを抽出
  • 17. CACHE ALGORITHM typedef struct { unsigned long tag; int data[8]; } CLine; ! typedef struct { CLine entry[512 / (8 * sizeof(int)]; } ETable; ETable cache; ! bool GetData(int* adrs, int *data) { unsigned long i = (adrs & 0x000001E0) >> 5; ! if (cache.entry[i].tag == adrs & 0xFFFFFE00) { *data = cache.entry[i].data[adrs & 0x0000001F]; } ・タグ :0xFFFFFE00 ・インデックス :0x000001E0 ・ライン内オフセット :0x0000001F アドレスからタグを抽出して比較
  • 18. CACHE ALGORITHM typedef struct { unsigned long tag; int data[8]; } CLine; ! typedef struct { CLine entry[512 / (8 * sizeof(int)]; } ETable; ETable cache; ! bool GetData(int* adrs, int *data) { unsigned long i = (adrs & 0x000001E0) >> 5; ! if (cache.entry[i].tag == adrs & 0xFFFFFE00) { *data = cache.entry[i].data[adrs & 0x0000001F]; } ・タグ :0xFFFFFE00 ・インデックス :0x000001E0 ・ライン内オフセット :0x0000001F アドレスからライン内オフセットを抽出 ↑ここはちょっと変だけど許してね
  • 19. N-WAY ASSOCIATEVE CACHE Cache Entry Table Cache Entry Table Cache Entry Table Cache Entry Table タグ(上位アドレス) データ タグ(上位アドレス) データ タグ(上位アドレス) データ タグ(上位アドレス) データ nウェイアソシアティブ キャッシュを複数(n)毎持つ ダイレクトマップの欠点を解決 同一インデックスに対して 複数エントリを持つことで ヒット率向上。 アドレス 000000000000000000 000000000 00000 =? Hit or Miss ?
  • 20. MISS HIT! キャッシュ内のデータをライトバック データを読み込むためのキャッシュ エントリを確保するため。 LRU/ランダム/ラウンドロビン L2キャッシュから読み出し 読み出し終わるまでCPUはストール (パイプライン完全停止) Level 1 Cache 物理アドレスデータ 物理アドレスデータ 物理アドレスデータ 物理アドレスデータ L2 Cache
  • 21. About Level 2 Cache Processor LEVEL 2 CACHE CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache
  • 22. LEVEL2 CACHE SEQUENCE Address 確定 Tag 出力 比較 Data 出力 確定 Bus Clock L1 Cacheがアドレスを出力 L2 cacheがアドレスを確定 Tag読み出し制御 Tagが出力される Tag比較 -> Hit ! Data読み出し制御 Dataが出力される L1 Cacheへデータを返す 読み出しに8 Clock必要
  • 23. About DRAM Processor DYNAMIC RANDOM ACCESS MEMORY CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache
  • 25. 10 Clock@8wordバーストリード(キャッシュ1ラインフィルに相当) DDR3-SDRAM READ TIMING 参考資料: http://www.samsung.com/global/business/semiconductor/file/product/ddr3_device_operation_timing_diagram_rev121.pdf
  • 26. DDR3-SDRAM STATE CHART DDR3-SDRAMの内部状態遷移図 HW IPとして提供されることが多 いのでこれを理解している人は少 ないと思います。 重要キーワード ModeRegister プリチャージ リフレッシュ
  • 27. DRAMとキャッシュ DRAMはキャッシュに接続され る前提で機能実装 ラインフィルに必要なバース トモード 全てシングルアクセスする と致命的に遅い 要求されたデータから順にリー ド可能 Single Word Read = 7 Clock/Word 8 Words Burst Read = 1.25 Clock/Word (10 Clock / 8 Words) DRAMとキャッシュは密接な関係にあります
  • 28. Consideration Processor ヒット率と アクセス時間に 関する考察 CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache ?
  • 29. CPUの待ち時間 今までのワーストケースで1wordを読み出す時間を計算 tL1 = 1 Clock tL2 = 16 Clock (8 × 2CPUの半分のクロックで動作と過程) tDDR3 = 28 Clock (7 × 4 CPUバスの半分のクロックで動作と過程) tAllMiss = tL1 + tL2 + tDDR3 = 45 [Clock] CPUやシステムによって上記の値は全然違います。 実際の値を適用すると、もっとすごいことになります。 http://www.7-cpu.com/cpu/Cortex-A9.html
  • 30. キャッシュヒット率を考慮 キャッシュヒット率(仮定) L1、L2ともにhit率 = 90.0%と仮定。 Avarage Access Time = tL1×0.9 + tL2 × (1 - 0.9) + tDDR3 × (1 - 0.9) × 0.9 = 4.22[clock] バスクロックが遅いと? 同一クロックであっても外部バス速度が遅いCPUがあります。 例:Core2Duo 667MHz、Celeron 533MHz Avarage Access Time = tL1×0.9 + (tL2 × (1 - 0.9) + tDDR3 × (1 - 0.9) × 0.9) × 667/533 = 5.05[clock] ざっくり計算です。
  • 32. Study Processor 実験してみよう CPU Core L2 Cache Mem Ctrl DRAM HW… PCIe MMU L1 Cache ?
  • 33. Intel Performance Counter Monitorで実験してみましょう。 通常のループ 残念なループ ブロッキング アンローリング 行列計算 フォールスシェアリング
  • 34. 通常のループ src[row] += dst[row][col] dstのサイズ>>キャッシュ キャッシュ1ラインのワード数 ごとにキャッシュミスヒット。 row 0 1 src 9 row col 0 0 1 dst 65535 1 0 9 65534 9 65535 キャッシュ サイズ for (unsigned long row = 0; row < ROW_SIZE; row++) { for (unsigned long col = 0; col < COL_SIZE; col++) { *(dst + row) += *(src + row * COL_SIZE + col); } }
  • 35. 残念なループ rowのインクリメントを先にする。 インクリメント>>キャッシュ 毎回ミスヒットする。 row 0 1 src 9 row col 0 0 1 dst 65535 1 0 9 65534 9 65535 キャッシュ サイズ for (int col = 0; col < COL_SIZE; col++) { for (int row = 0; row < ROW_SIZE; row++) { *(dst + row) += *(src + row * COL_SIZE + col); } }
  • 36. ブロッキング キャッシュサイズの範囲内で 一通り処理する。 終わったら次の領域に移る。 ミスヒットが格段に減る。 row 0 1 src 9 row col 0 0 1 dst 65535 1 0 9 65534 9 65535 キャッシュ サイズ for (int Blk = 0; Blk < COL_SIZE; Blk += BLKSIZE) { for (int row = 0; row < ROW_SIZE; row++) { for (int col = Blk; col < Blk + BLKSIZE; col++) { *(dst + row) += *(src + Blk * BLKSIZE + col); } } } ブロック サイズ
  • 37. ループアンローリング ループ処理を展開して分岐命 令を削減 展開しすぎるとプログラム が大きくなり、命令キャッ シュミスが増える for (unsigned long row = 0; row < ROW_SIZE; row++) { for (unsigned long col = 0; col < COL_SIZE;) { *(data_dst + row) += *(data_src + row * COL_SIZE + col++); *(data_dst + row) += *(data_src + row * COL_SIZE + col++); *(data_dst + row) += *(data_src + row * COL_SIZE + col++); …略… *(data_dst + row) += *(data_src + row * COL_SIZE + col++); } } 処理 インクリメント 分岐判定 処理 インクリメント 分岐判定 処理 インクリメント 分岐判定 処理 インクリメント 処理 インクリメント 処理 インクリメント … … 実行命令数が減る =処理時間も減る プログラムサイズは 増える
  • 38. 行列計算 普通にアルゴリズムを書くと、先ほどの「普通のループ」 と「残念なループ」の組み合わせになる。 片方をわざと行列を入れ替えて定義する int A[row][col]; int B[col]row]; int A[row][col]; int B[row][col];
  • 39. フォールスシェアリング 複数のスレッドが同一キャッシュラインのデータにライト アクセスするときに発生し得る問題。 Core1 Core2 Cache Line Cache Line DRAM Core 1とCore2は異なるアドレスにライトする。 アドレスは異なるが、キャッシュラインは同一。 Core1がデータを書き換える。 他コアもキャッシュしているため、DRAMにライトバック。 Core2はDRAMとキャッシュが不一致のため、キャッシュさ れていたデータは「無効(データ無し)」とする。 Core2がデータを書き換える。 ミスヒットが発生し、DRAMからデータを読み出す。
  • 40. フォールスシェアリング解決策 複数のスレッドで共有する必要の無いデータはアドレスが 64バイト以上離れるようにする。 Core1 Core2 Cache Line Cache Line DRAM void worker_thread1(void) { for (int i = 0; i < MAX; i++) dstArea[0] += srcArea[i]; } ! void worker_thread2(void) { for (int i = 0; i < MAX; i++) dstArea[1] += srcArea[i]; } ! void worker_thread3(void) { for (int i = 0; i < MAX; i++) dstArea[64] += srcArea[i]; } thread1と2はフォールスシェアリング thread1と3は無し
  • 41. 実験結果:ループ 「残念なループ」はキャッシュヒッ ト率が低く、DRAMアクセスが多 い。 「ブロッキング」はDRAMアクセ スが少ない。 簡単なプログラムのため差が 出にくかったかも。 テストプログラム以外のプロセ スのカウント値も含まれてい ると思われます。 時間L1 HIT DRAM READ 普通1.68 99.82 5542MB 残念14.09 89.54 41100MB ブロッキ ング1.63 99.95 283MB アンロー リング1.62 99.91 5460MB
  • 42. 実験結果:行列計算/シェアリング 行列を入れ替えるとキャッシュ ヒット率が向上しDRAMアクセ スが減る。 フォールスシェアリングを回避 することによりDRAMアクセス が半分になっている。 「ループ」、「行列計算」、 「シェアリング」はそれぞ れ異なるテストプログラムを 実行しています。 時間L1 HIT DRAM READ 通常13.33 92.30 49.8GB 行列 入れ替え2.06 99.75 10.7GB 時間L1 HIT DRAM READ FALSE SHARE 10.54 95.42 926MB NONE SHARED 4.62 98.77 421MB
  • 43. 参考資料 アーキテクチャ全般 David A.Patterson/John L.Hennessy; パターソン&ヘネシー コンピュータの構成と設計 第4版, 日経BP社, 2011年. 中森 章; マイクロプロセッサ・アーキテクチャ入門, CQ出版, 2004年. CPU実例 ARM Cortex-A9 テクニカルリファレンスマニュアル, r2p2 CoreLink Level 2 Cache Controller L2C-310 Technical Reference Manual, r3p3 Intel Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide, Part 1 Intel® 64 and IA-32 Architectures Optimization Reference Manual Performance Analysis Guide for Intel® Core™ i7 Processor and Intel® Xeon™ 5500 processors