2008-01-09

The Memory Mountain

              My Memory Mountain ↑     
↓Sample Memory Mountain(2002) 

…え~と、2007年購入のMy notePCは2002年のPC(sever)に2倍以上の差で負けますたorz
しかし、先生のノートPCは3,200だったよな…。これが一般人と研究者のスペックの差かorz orz
フーリエ課題は終わったけど、発展課題もやっておかなくてはな。

でも、解析学は若干苦手だ。。。

ということで、フーリエ解析の発展問題は、一旦置いておいて、ほかの事をやってみるテスト。
結果:
プログラミング言語論(課題+発展提出)、CPE計測(追加考察&校正終了)、
MIT lecture summary(これ以上のdownsizeは無理ぽorz)


[reference:"Computer Systems: A Programmer's Perspective" (CS:APP)]
プリント(A3)2枚
・Class14
・Class19(2002)/16(2006)
・Class20(2002)/17(2006)

(.../opt)
☆.../mem/mountain/mountain.c

warm upと
各strideの実行と
その結果表示を
同時にやってくれるプログラム。

Excelに出力させると、とてもわかりやすい。
教科書の著者はさらに、グラフを作っている。
→上2行を省けば、ほぼ等高線に近いグラフになっている。


・図に関して、
ストライドは"s1, s4, ... ,s22まで
容量は32m, 512k, 8k

→メモリの性能は、アクセスする幅によって、大幅に変わる

ゲレンデみたいなところ(右側中部)で、プログラムがかけると嬉しい。
谷底みたいなところには、出来ればいきたくない。


・L1cacheにのると、メモリマウンテンの一番高いところの性能が出る
・L2は真ん中のゲレンデあたりの性能が出る。
・キャッシュから外れると谷底。
→ストライドが小さいと中々性能が良い。
→何故→1回はずれると、あとの7回が当たるから。


・メモリマウンテンは眺める角度を変えることが出来る
裏面から見ると、実は崖になっている。
つまり、アクセスする幅が少なすぎるとそれはそれでマズイ。

2002年頃の性能結果(講義資料:server)→1MB/s
現代のPCの性能結果(先生のノートPC)→3Mb/s
つまり、当時と今では、3倍ぐらい早さが違う


・メモリマウンテンの一番左側のラインをプロットすると、そこの局所性が分かる。
→結果:明らかに3つのゾーンがあることが分かる。
S1から順番に[キャッシュはずれ, L2, L1]で早くなっていく?※要確認


・真ん中のゲレンデのところ
→S1からS16に向けて段々遅くなっていく。
始めは、つまり、一つの要素が外れると7つがうまくいく
グラフ右側のフラットな部分は、一個の部分を読み込んで他の部分を読み捨てている。
→もったいない!!


・真ん中のslope→降りる場所はs16
1キャッシュラインに16個のキャッシュがある?


・メモリマウンテンを見ると1次キャッシュ、2次キャッシュが明確に分かる。
→一番右側奥のstrideを大きくすると隆起した部分は、現段階ではとても難しい話でまだ説明できない。


・東大、Quad coreのopteron搭載の国内最速スパコン。(日立協力)
~約15,000コアで理論ピーク性能140TFLOP
→作るのは簡単。つなげればいいだけ。
ただし、2.3Ghzを4個(16コア)搭載したものを繋げる。→これは難しい。
先生の研究室もそれを買おうとしている?


・AMD's "TLB"について
年末に売り出そうとして、延期になっている。→株価下落。
論理設計にミスがあることが分かった。
opteron2.3Ghzは世の中にはまだ売り出されていない。
Bug in AMD's quad-core Barcelona and phenom may be more serious than previously suspected.
→そのバグは結構重大だぞ。といっている。


・Quad-coreのメモリ性能?
・メモリ性能はそんなに変わらない。
・最上部がフラットになっている(3Mb/s)
・L2のスキーヤーゾーンっぽい傾斜が長い。
・スロープがさらにもう一個ある→L3がある。
・ゲレンデだとCPUのコアが独立で出来る?

バグフィックスのために今の性能より、若干性能が落ちると予測できる。

→課題はなるべく谷底には行かないようなプログラムを作ってね(はぁと。



・2次元配列のコピーについて
srcからdstにコピーする。
→for文外側の添え字配列の左側に、
for文内側の添え字配列の右側に送ったほうが早い
(常識らしい)

まともなプログラム CPE=14.10 (ただし、最適化は行っていない)
うっかり添え字を逆にしたプログラム CPE=370
結果:20倍性能が違う

・本当にそれほど遅くなるのか?実験してみる
ためしに配列のサイズARRAY_MAXを一つ大きくしてみる 2048→2049 ←※重要
→うっかり間違えプログラムを実行
結果:CPE=34.57

つまり、配列の要素を2^Nで確保すると、悲惨なことが起こる
[例2]1024で下手なプログラムを書く 結果:CPE=300
1023で下手なプログラムを書く 結果:CPE=27
→何故このような結果が出るのか考えてみる→課題の考察に追加で書いた方が良いっぽい?


・今度は違う形で実験
メモリマウンテンでは3200万個ぐらいアクセスするけど、

今回は、アクセス256個、ストライド1~1400まで(1024を包括するため)で実験してみる。
直感では全部キャッシュに乗る、はず。
どんなへたくそなプログラムでも、256個のintegerデータなら
全て1次キャッシュに乗る、はず。
結果;256個の一回分のクロックサイクルを見ていくと
前半:大体600付近 + ところどころ1600の突出がある(スパイクと呼ぶ)
後半:ほとんど1600になる

→何故かこのような結果になるのか?

・グラフにしてみる
結果:arc tangentみたいなぐらふ?
序盤 = フラット+ところどころにスパイク(64の倍数の定期的なスパイク + 不定期なスパイク)
中盤1= 右肩上がり(大) + ところどころのスパイク
中盤2= 右肩上がり(中) + ところどころのスパイク
終盤 = とても遅い数値のフラット+(スパイク?あったけ?うる覚え)



・opteronの場合。
この実験をすると、いいプログラムは CPE=600 → これはよい
また、悪いところ(終盤)でも2倍ぐらい → まぁよい

!!ただし!!
・あちこちでスパイクの不定期な頻出と定期的な頻出が出ている。
特に、1024の部分が"とんでもなく遅い"
また、512の部分が"とても遅い"

ModernのCPUだとこれだけ複雑な結果がでてくる。
下手な数(つまり、キリのいい数)を書くと、
スパイクに当たってしまい、非常に遅いプログラムになる可能性がある。
また、逆に考えれば、メモリアクセスの管理は恐ろしく複雑なことをやっていることが分かる。

*2006年版の資料の方が2002年版より分かりやすいらしいよ。



【仮想記憶について】
CPUから効率的に取る必要がある。
複雑なロジックだからAMDの人もバグに苦労してしまった。

※CAUTION ※
!!ここら辺からちょっと教室がうるさくなったので、聞き逃し部分がある!!
!!講義資料とノートを比較して、事実を確認した方がよい       !!

消費電力を少なくする。
→これだとサーバーの世界には勝てない。
・講義:Virtual Memory
来年はOSの授業がある→そこでも仮想記憶について触れる→その予習と思って聞いてほしい。

機械語の命令なので番地がある。
メモリの番地とその番地が同じであるかというと、そうではない→バーチャルな番地がある
→4100番地でも4100番地にいくとは限らない。

つまり、キャッシュには無くても仮想記憶にはある場合がある。
desktopやlaptopはほとんどこんな感じ。
→仮想記憶はとても偉大なアイデアだ、と著者は述べている。


[Address Spaces]
この授業は3年前に大幅に模様替えした。
なぜなら、そのころはCPUのアドレスは32bitだった
しかし、今はcore2やopteronだと64bitになった。
→大きなアドレスに触れるようになった。

例えば、積んでいるメモリ1Mでも、最低メモリ4MB必要な動作を行うことが出来る。
→どうして?
→Nがバーチャルなアドレススペースとなる。
→Mはフィジカルなアドレススペース(物理アドレス)
32bit→4GB
64bit→4GB×2^32(=約40億)

→64bitだと仮想記憶はいらないのでは?

では、何故使うのか。

→"性能を超えたプログラムでも動かすことが出来る!"

Main memory is a chache for rhw contents of a virtual address space stored on disk
→必要に応じて読んだり読みこなかったりする。

読み書きしちゃいけないメモリを触ってブルースクリーンになることはよくある。

記憶管理には慎重に。→あるプロセスはメモリ領域を勝手に読み書きしてはいけない。

中にはOSの秘密な情報があったりする。→勝手に読み込まれては困る

[1]は効率、[2][3]はOSについての話
今回は[1]について重点的に話していく。

・仮想記憶の空間があって、ある程度大きい。
→バーチャルメモリは、どこの物理メモリがのっかっているか、という情報を持っている必要がある。


理論的には通じるけど、定常的には変わってくる。→プリントP.7
キャッシュに乗るプログラムとならないプログラム。
一般的に
キャッシュ → SRAM
メインメモリ→ DRAM
DRAMにも乗らないところ → DISKに行く (この場合、性能は10万倍ぐらい違う)
となっている。

EX.レポート書きながらエクセル,音楽,画像弄くるなどをやってると、
全体のメモリ量はバカにならない。同時に実行すると、急に遅くなる。
これは、全体としてメモリに乗らないので、ある仕事に必要な容量はDisk間とやりとりしてしまう
→動作が遅くなる and "disk"がカタカタ音を出し始める。これを”Thrashing”という
→補足:よってThrashingが起こる=とても動作が遅くなる。

メモリとDiskのやりとりは 4 or 8 KBが典型的
一個のキャッシュライン
→3号車のどこに目的の値があるか探すのが大変。
すきなモノが好きなフィジカルページに行ける。
いける場所は多少限られている。

any virtual page can be places in any physical page.
メインメモリとDiskのreplacement algorithmsは複雑。
メインメモリにすぐに書き続けていくと、大変
メインメモリには反映させるけどDiskまでは反映させない。遅いから→write-back方式 を採用?

virtual memory(disk上にある)
仮想的にDiskにある。
実際に積んでるメモリ→physical memory(DRAM)

ページテーブル。4kBの単位で管理/情報の受渡が行われている。
nullは全然使ってない。
物理なのか仮想なのかどこに乗っかっているかを管理するところ。→必ずある。

乗ってたらページヒット。
プログラムが見にいたアドレスがDiskにある→"ページフォールト"→これが遅くなる理由
メインメモリに乗っていないところにアクセスした場合のこと。


大体何やっているか→プリントP12
"DMA" = direct memory access
DisKを一旦メモリのおいて、その後processorから読み取る。よって、とても遅い。

【大事な言葉集】
VM
Page failt
DMA
working set
Thrashing


同時に使う総量はたいしたことがない。
プログラムの実行中のある時点の前後0,何秒ぐらいでは、
バーチャルページのいくつかの選ばれた場所、部分集合にアクセスする。
(部分集合→ワーキングセット?)

ワーキングセットがメインメモリより小さければ、最初はミスするけど、その後は良い性能が起こる。

・メモリマネジメントの話。OSの話なので省略
・残りの話→最終回

【期末試験について】
日付、1月30日
資料持込可、基本的には何でもOK(パソコン不可)。
CS:APPの講義スライドのコピーも持ち込みか
(持ち込むことを進めます)
試験範囲は授業で扱った内容
・配点
期末試験:約50%
レポート:約50%

0 件のコメント: