PCメモリマップ
先頭1MBは潰してはいけない領域がいくつかある。
http://wiki.osdev.org/Memory_Map_%28x86%29
知らないうちにIVT潰していた…
あとUpperのISA Memory Holeて現在のPCで確認できるのだろうか…
誰の役にも立たない D510MO vs D945GCLF2 ベンチマーク
D510MO と D945GCLF2 はチップの中身はほぼ一緒だが、接続方式が違うだけという、マイクロベンチマークネタ的に大変素晴らしい差分なので、みなさんもっとベンチマークを取るべきである。
というわけで測った。結論としては、全然速くなっていない。
測ったのは以下。
- シングルスレッドメモリバンド幅
- マルチスレッドメモリバンド幅
- r8169のレイテンシ
- mwaitで通信したときのレイテンシ
なお、現状、手元にデータがあるだけで、検証とかはまだしていない。書きながら考える。
OSの影響を無くすため、実験は例のQO3システム上で行った。
ソースは、
http://morihyphen.hp.infoseek.co.jp/files/qo3-20100112.tar.gz
で、kernel/bench.c がそれ。
QO3システムは、色々とやりたいことの踏み台なのだが、そのひとつが、OSの影響を受けないベンチマークが取りたいというものであった。
(ちなみに、QO3という名前は、「ネズミを横に倒したみたいに見える」というだけの名前であり、何かの頭文字に見えて全然そうではないというアレである)
計測は各環境で二回づつ行い、あまり違いが無いことを目視で確認。それぞれ二回目の結果を載せる。
# D510MO copy: 46438120 copy: 46880130 store: 30137030 store_stream: 18602510 load: 12780420 r8169 tx packet(1): 13910 r8169 tx packet(2): 13600 r8169 tx packet(4): 7030 r8169 tx packet(8): 14110 r8169 tx packet(16): 13330 r8169 tx packet(32): 12830 r8169 tx packet(64): 11030 r8169 tx packet(128): 14750 r8169 tx packet(256): 12500 r8169 tx packet(512): 14200 r8169 tx packet(1024): 26100 r8169 tx packet(2048): 35720 available processors: 1 2 3 ready all cpus mwait ping pong(1-1): 3920 mwait ping pong(1-2): 1680 mwait ping pong(1-3): 1550 mwait ping pong(2-1): 3880 mwait ping pong(2-2): 3870 mwait ping pong(2-3): 1450 mwait ping pong(3-1): 1530 mwait ping pong(3-2): 1480 mwait ping pong(3-3): 3750 mwait ping pong(4-1): 1910 mwait ping pong(4-2): 1500 mwait ping pong(4-3): 3760 parallel copy(1): 66366720 parallel store_stream(1): 25799490 parallel load(1): 17539800 parallel copy(2): 62011800 parallel store_stream(2): 26295260 parallel load(2): 16901500 parallel copy(3): 62001430 parallel store_stream(3): 26286260 parallel load(3): 16911880 parallel copy(all): 112682790 parallel store_stream(all): 45235610 parallel load(all): 31476570
# D945GCLF2 copy: 60292212 copy: 60351588 store: 35966832 store_stream: 18432684 load: 16102476 r8169 tx packet(1): 13560 r8169 tx packet(2): 12060 r8169 tx packet(4): 6780 r8169 tx packet(8): 12468 r8169 tx packet(16): 7092 r8169 tx packet(32): 6996 r8169 tx packet(64): 7236 r8169 tx packet(128): 7788 r8169 tx packet(256): 13692 r8169 tx packet(512): 14952 r8169 tx packet(1024): 21528 r8169 tx packet(2048): 36660 available processors: 1 2 3 ready all cpus mwait ping pong(1-1): 2364 mwait ping pong(1-2): 1884 mwait ping pong(1-3): 1776 mwait ping pong(2-1): 3972 mwait ping pong(2-2): 1740 mwait ping pong(2-3): 3456 mwait ping pong(3-1): 2304 mwait ping pong(3-2): 3492 mwait ping pong(3-3): 1692 mwait ping pong(4-1): 2568 mwait ping pong(4-2): 1824 mwait ping pong(4-3): 1728 parallel copy(1): 96345684 parallel store_stream(1): 26677992 parallel load(1): 22670520 parallel copy(2): 95351580 parallel store_stream(2): 26443020 parallel load(2): 21401652 parallel copy(3): 95904744 parallel store_stream(3): 26491944 parallel load(3): 21442404 parallel copy(all): 194212344 parallel store_stream(all): 45941052 parallel load(all): 55451256
メモリ転送
16MB のデータをコピー、ストア、キャッシュ無しストア、ロードしたときの結果である。単位はrdtscの単位。
copy: 46438120 copy: 46880130 store: 30137030 store_stream: 18602510 load: 12780420
copy: 60292212 copy: 60351588 store: 35966832 store_stream: 18432684 load: 16102476
D945GCLF2 は 533、D510MO は 800 のメモリを使える。ここではDDR2-800のメモリを使ってるのでその分理論値が違う。理論値では945は510の66.7%しか出ない。
単位はrdtsc単位なので、1.66G で割ると、秒が出る。そこらへんの値は皆に暗算していただいて、国家の算数力向上に役立ててもらいたい。
え、暗算なんて面倒だって?いや…確かに俺が読むのも面倒だな…[MB/sec]単位に直したものを以下にしめす。
copy 594.07212736 store 924.118221338 store_stream 1497.11939733 load 2179.12858576
copy 461.465546855 store 774.329486678 store_stream 1510.91281986 load 1729.55876848
なお、理論値は、DDR2-533で4600MB/s、DDR2-800で6400MB/sである。(あれ?PCのDDR2て両方向だったっけ?)
うーん…微妙だなぁ…。
460 / 0.67 = 686.6
774 / 0.67 = 1155.2
1510.9 / 0.67 = 2255.0
1729.6 / 0.67 = 2581.5
なので、メモリバンド幅分広がった分が発揮できたわけではないというか…store_streamに至ってはむしろ遅いという…
メモリコントローラが近くなったのは、あまり意味が無いようで、メモリが800になった分速くなったのか?なんとも評価しづらい結果である。
(レイテンシを測りたい)
r8169 レイテンシ
r8169で、パケットを送って、送信完了割り込みまでの時間を計測。転送量は、1から始めて、2048まで倍にしていく。
# D510MO r8169 tx packet(1): 13910(8.379518[usec]) r8169 tx packet(2): 13600(8.192771[usec]) r8169 tx packet(4): 7030(4.234940[usec]) r8169 tx packet(8): 14110(8.500000[usec]) r8169 tx packet(16): 13330(8.030120[usec]) r8169 tx packet(32): 12830(7.728916[usec]) r8169 tx packet(64): 11030(6.644578[usec]) r8169 tx packet(128): 14750(8.885542[usec]) r8169 tx packet(256): 12500(7.530120[usec]) r8169 tx packet(512): 14200(8.554217[usec]) r8169 tx packet(1024): 26100(15.722892[usec]) r8169 tx packet(2048): 35720(21.518072[usec])
# D945GCLF2 r8169 tx packet(1): 13560(8.168675[usec]) r8169 tx packet(2): 12060(7.265060[usec]) r8169 tx packet(4): 6780(4.084337[usec]) r8169 tx packet(8): 12468(7.510843[usec]) r8169 tx packet(16): 7092(4.272289[usec]) r8169 tx packet(32): 6996(4.214458[usec]) r8169 tx packet(64): 7236(4.359036[usec]) r8169 tx packet(128): 7788(4.691566[usec]) r8169 tx packet(256): 13692(8.248193[usec]) r8169 tx packet(512): 14952(9.007229[usec]) r8169 tx packet(1024): 21528(12.968675[usec]) r8169 tx packet(2048): 36660(22.084337[usec])
さて、D510MOには、新しくNM10というチップが付いており、これの威力を測定するという目的である。
しかし、どう見てもD510MOの方が遅いのだった。まあ、これは周辺チップの問題もあるだろうから、NM10やD510が遅いとは断言できないが…
あとバラつきが大きいので、平均とったほうが良いのかも。
mwait ping pong
mwaitで待ってる隣のプロセッサを起こして、自分はmwaitで待機。相手のプロセッサが自分を起こしてくれるまで待ち、その時間を計測する。
プロセッサ間通信の性能を測る目的である。
1-1とかなっているのは
(<mwaitするときのC state> - <APのID>)
であるが、APのIDとか、C stateて何?まあ、あまり有意な値は出てないのでよくわからなくても構わない。(というか本当にC state効いてるのか心配になるな…)
# D510MO mwait ping pong(1-1): 3920(2.361446[usec]) mwait ping pong(1-2): 1680(1.012048[usec]) mwait ping pong(1-3): 1550(0.933735[usec]) mwait ping pong(2-1): 3880(2.337349[usec]) mwait ping pong(2-2): 3870(2.331325[usec]) mwait ping pong(2-3): 1450(0.873494[usec]) mwait ping pong(3-1): 1530(0.921687[usec]) mwait ping pong(3-2): 1480(0.891566[usec]) mwait ping pong(3-3): 3750(2.259036[usec]) mwait ping pong(4-1): 1910(1.150602[usec]) mwait ping pong(4-2): 1500(0.903614[usec]) mwait ping pong(4-3): 3760(2.265060[usec])
# D945GCLF2 mwait ping pong(1-1): 2364(1.424096[usec]) mwait ping pong(1-2): 1884(1.134940[usec]) mwait ping pong(1-3): 1776(1.069880[usec]) mwait ping pong(2-1): 3972(2.392771[usec]) mwait ping pong(2-2): 1740(1.048193[usec]) mwait ping pong(2-3): 3456(2.081928[usec]) mwait ping pong(3-1): 2304(1.387952[usec]) mwait ping pong(3-2): 3492(2.103614[usec]) mwait ping pong(3-3): 1692(1.019277[usec]) mwait ping pong(4-1): 2568(1.546988[usec]) mwait ping pong(4-2): 1824(1.098795[usec]) mwait ping pong(4-3): 1728(1.040964[usec])
Atom 330は、MCMのデュアルコアだったのが、Atom D510では統合された。これにより、プロセッサ間の通信レイテンシは劇的に低下するのである!!
…はずだったがどう見ても変化ありません。本当にありがとうございました。
統合されたからといって、性能に違いが出るわけではない!勉強になったね!
あと、HyperThreadingで隣にいるの(ID=1)と、別コア(ID=2,3)との通信コストが全然変わらないのは意外。
(バラツキが大きいので、平均とったほうがいい)
マルチスレッド メモリ転送
メモリ転送を複数スレッドでやる。
copy (1) とかなってる、(1) は、AP ID=1と、BSPで並列してるという意味で、(all)は全4スレッドで処理してるという意味。
# D510MO parallel copy(1): 66366720(839.281452[mb/sec]) parallel store_stream(1): 25799490(2158.971248[mb/sec]) parallel load(1): 17539800(3175.655202[mb/sec]) parallel copy(2): 62011800(898.221905[mb/sec]) parallel store_stream(2): 26295260(2118.266072[mb/sec]) parallel load(2): 16901500(3295.586612[mb/sec]) parallel copy(3): 62001430(898.372136[mb/sec]) parallel store_stream(3): 26286260(2118.991333[mb/sec]) parallel load(3): 16911880(3293.563881[mb/sec]) parallel copy(all): 112682790(988.622258[mb/sec]) parallel store_stream(all): 45235610(2462.677396[mb/sec]) parallel load(all): 31476570(3539.163074[mb/sec])
# D945GCLF2 parallel copy(1): 96345684(578.130278[mb/sec]) parallel store_stream(1): 26677992(2087.876671[mb/sec]) parallel load(1): 22670520(2456.951015[mb/sec]) parallel copy(2): 95351580(584.157673[mb/sec]) parallel store_stream(2): 26443020(2106.429490[mb/sec]) parallel load(2): 21401652(2602.619514[mb/sec]) parallel copy(3): 95904744(580.788341[mb/sec]) parallel store_stream(3): 26491944(2102.539441[mb/sec]) parallel load(3): 21442404(2597.673149[mb/sec]) parallel copy(all): 194212344(573.602645[mb/sec]) parallel store_stream(all): 45941052(2424.862065[mb/sec]) parallel load(all): 55451256(2008.984508[mb/sec])
store_streamに違いが無いのは変わらず。
おい!storeを計測し忘れてるぞボケが!
loadは…お、ようやく、D510が素晴らしいという成果を見せてくれた!
D945GCLF2は、4スレッドでloadすると、2スレッドに比べて性能が落ちるのだが、D510MOは、2スレッドに比べると4スレッドのほうが速い!
まとめ
マイクロベンチマークレベルで見ても、D510は330に比べて、速いわけではない。むしろ遅い場合もある。
DDR2-533とDDR2-800の違いの分メモリ転送が速くなっている場合もあるが、理論値の向上率から予想される向上率よりもかなりショボい。
ただ、マルチスレッドでメモリをロードした時の性能だけは素晴らしい!
D510を使う人は、マルチスレッドでメモリロードをするべき。(ただしストアしてはいけない)
ジレンマ
つまり、社内の雰囲気が良くないとき、それは労働者がアホだからそうなったのではなくて、手元の作業を最適化した結果、そうなってしまっているという可能性があるという話である。