SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
Cpu cache arch
Report
Shinichiro Niiyama
Follow
Aug. 22, 2014
•
0 likes
•
6,865 views
1
of
43
Cpu cache arch
Aug. 22, 2014
•
0 likes
•
6,865 views
Download Now
Download to read offline
Report
Technology
Shinichiro Niiyama
Follow
Recommended
CPUの同時実行機能
Shinichiro Niiyama
4.4K views
•
53 slides
Cpu pipeline basics
Shinichiro Niiyama
4.9K views
•
45 slides
Optimization night 4_dp
Kensuke Otsuki
683 views
•
53 slides
名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする
Kouhei Sutou
1.4K views
•
57 slides
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
30K views
•
33 slides
.NET Core 3.0 + Windows 10 で WPF 開発
一希 大田
11.1K views
•
37 slides
More Related Content
What's hot
HDFS vs. MapR Filesystem
日本ヒューレット・パッカード株式会社
598 views
•
76 slides
コルーチンの使い方
Naohiro Yoshikawa
14.7K views
•
52 slides
Container Storage Best Practices in 2017
Keith Resar
2.9K views
•
40 slides
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
28.8K views
•
33 slides
小型安価なFPGAボードの紹介と任意波形発生器
uchan_nos
645 views
•
56 slides
系統程式 -- 第 5 章
鍾誠 陳鍾誠
2.5K views
•
71 slides
What's hot
(20)
HDFS vs. MapR Filesystem
日本ヒューレット・パッカード株式会社
•
598 views
コルーチンの使い方
Naohiro Yoshikawa
•
14.7K views
Container Storage Best Practices in 2017
Keith Resar
•
2.9K views
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
•
28.8K views
小型安価なFPGAボードの紹介と任意波形発生器
uchan_nos
•
645 views
系統程式 -- 第 5 章
鍾誠 陳鍾誠
•
2.5K views
Verilog-HDL Tutorial (14)
Hiroki Nakahara
•
1.5K views
本当にわかる Spectre と Meltdown
Hirotaka Kawata
•
11.5K views
Fbx解説 (1 構文編) (1)
らりお ザ・何とは言わない天然水ソムリエ
•
11K views
Vim script と vimrc の正しい書き方@nagoya.vim #1
cohama
•
38.7K views
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
•
34.8K views
Code jp2015 cpuの話
Shinichiro Niiyama
•
1.8K views
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
shinjiigarashi
•
1.1K views
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
Masashi Shibata
•
3K views
ニューラル・ネットワークと技術革新の展望
maruyama097
•
3.3K views
規格書で読むC++11のスレッド
Kohsuke Yuasa
•
17.5K views
私のファミコンのfpsは530000です。もちろんフルパワーで(以下略
Hiroki Nakahara
•
8.7K views
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
•
22.6K views
templateとautoの型推論
MITSUNARI Shigeo
•
15K views
僕のIntel nucが起動しないわけがない
Takuya ASADA
•
19.2K views
Viewers also liked
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
智啓 出川
1K views
•
53 slides
便利な数を100億個の乱数から算出
Toshiyuki Shimono
1.8K views
•
13 slides
確率論基礎
hoxo_m
13.1K views
•
32 slides
AtCoder Regular Contest 016 解説
AtCoder Inc.
6.4K views
•
20 slides
H231126 統計および確率を利用した予測と判断rev1
Kenichi Takara
1.5K views
•
32 slides
統計勉強会 LT ベイジアンって?
Yuto Suzuki
1.8K views
•
25 slides
Viewers also liked
(20)
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
智啓 出川
•
1K views
便利な数を100億個の乱数から算出
Toshiyuki Shimono
•
1.8K views
確率論基礎
hoxo_m
•
13.1K views
AtCoder Regular Contest 016 解説
AtCoder Inc.
•
6.4K views
H231126 統計および確率を利用した予測と判断rev1
Kenichi Takara
•
1.5K views
統計勉強会 LT ベイジアンって?
Yuto Suzuki
•
1.8K views
Life with jupyter
Etsuji Nakai
•
3.1K views
経験過程
hoxo_m
•
9.9K views
EthernetやCPUなどの話
Takanori Sejima
•
18.2K views
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
Hirotaka Nishimiya
•
2.3K views
「数学の世界」発表資料
spdbear
•
1.7K views
Windows10の展開手法
NAOKI ABE
•
27.5K views
MLaPP 2章 「確率」(前編)
Shinichi Tamura
•
3.6K views
カップルが一緒にお風呂に入る割合をベイズ推定してみた
hoxo_m
•
76.2K views
ベイズ基本0425
asato kuno
•
1.3K views
TensorFlowで学ぶDQN
Etsuji Nakai
•
10.1K views
ベイズ統計入門
Miyoshi Yuya
•
58.3K views
ゼロから始める自作 CPU 入門
Hirotaka Kawata
•
42K views
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
Etsuji Nakai
•
21.3K views
CPUに関する話
Takanori Sejima
•
20.9K views
Similar to Cpu cache arch
HandlerSocket plugin for MySQL
akirahiguchi
12.9K views
•
51 slides
Prosym2012
MITSUNARI Shigeo
2.7K views
•
33 slides
NVIDIA Japan Seminar 2012
Takuro Iizuka
1.5K views
•
38 slides
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
2.1K views
•
84 slides
Boost Tour 1.53.0 merge
Akira Takahashi
4.5K views
•
116 slides
core dumpでcode golf
Nomura Yusuke
2.5K views
•
25 slides
Similar to Cpu cache arch
(20)
HandlerSocket plugin for MySQL
akirahiguchi
•
12.9K views
Prosym2012
MITSUNARI Shigeo
•
2.7K views
NVIDIA Japan Seminar 2012
Takuro Iizuka
•
1.5K views
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
•
2.1K views
Boost Tour 1.53.0 merge
Akira Takahashi
•
4.5K views
core dumpでcode golf
Nomura Yusuke
•
2.5K views
HTTP/2, QUIC入門
shigeki_ohtsu
•
47K views
Parquetはカラムナなのか?
Yohei Azekatsu
•
3.2K views
PostgreSQL13 新機能紹介
Satoshi Hirata
•
192 views
Pfi Seminar 2010 1 7
Preferred Networks
•
3.4K views
Apache Avro vs Protocol Buffers
Seiya Mizuno
•
5.2K views
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Satoshi Mimura
•
21.8K views
Buffer overflow
ionis111
•
3.1K views
Introduction of Oracle Database Architecture
Ryota Watabe
•
4.2K views
Reconf 201901
Takefumi MIYOSHI
•
1.6K views
0章 Linuxカーネルを読む前に最低限知っておくべきこと
mao999
•
9.1K views
SSL/TLSの基礎と最新動向
shigeki_ohtsu
•
56.7K views
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Hiro H.
•
3.9K views
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
•
94.8K views
Dalvik仮想マシンのアーキテクチャ 改訂版
Takuya Matsunaga
•
5.3K views
Recently uploaded
CCoE実践者コミュニティ#1_CCoEが進めるセキュリティカイゼンの旅.pptx
Tomoaki Tada
25 views
•
20 slides
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
57 views
•
12 slides
松下研究室紹介_関西大学高槻キャンパスオープンキャンパス
Matsushita Laboratory
26 views
•
23 slides
20230921_IoTLT_vol103_kitazaki_v1.pdf
Ayachika Kitazaki
81 views
•
16 slides
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
97 views
•
31 slides
gtk4_gem_usage.pdf
ssuser0ef4681
11 views
•
6 slides
Recently uploaded
(8)
CCoE実践者コミュニティ#1_CCoEが進めるセキュリティカイゼンの旅.pptx
Tomoaki Tada
•
25 views
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
•
57 views
松下研究室紹介_関西大学高槻キャンパスオープンキャンパス
Matsushita Laboratory
•
26 views
20230921_IoTLT_vol103_kitazaki_v1.pdf
Ayachika Kitazaki
•
81 views
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
•
97 views
gtk4_gem_usage.pdf
ssuser0ef4681
•
11 views
テスト自動化.pdf
ssuserf8ea02
•
16 views
GraphQLはどんな時に使うか
Yutaka Tachibana
•
6 views
Cpu cache arch
1.
あなたのお家に届くまで CPUキャッシュアーキテクチャ入門(その1) !
Dora. Panda October 18th, 2014
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レジスタにロードされるまで 長い旅路の物語
6.
と、その前に…レジスタって? パソコン初心者向け説明 CPUはメモリに情報を置く
メモリに入りきらないとき はHDDに退避 CPU DRAM HDD
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
24.
外部デバイスアクセス DRAMは外部デバイス 制御用のHWが必要
非常に低速 CPUクロックの5~10分の1
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] ざっくり計算です。
31.
キャッシュやメモリ制御回路が 大部分を占めます。
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