Pineviewが出たらネットブックも買おうと思ってたのだが、今のと同じ64GB SSDというのが無い。
「そーっとテーブルに置く」とかがやりたくないのでSSDが良いのだが、16GBは小さすぎる。
別にHDDでも壊れないとは思うが、やっぱり投げたり落としたりした時にドキっとしてしまうのは嫌である。

誰の役にも立たない 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を使う人は、マルチスレッドでメモリロードをするべき。(ただしストアしてはいけない)

1秒

邪悪な方法を使って目標達成した。
さてどうするか…

そしてわかったことは、GCCレジスタアロケーション & 命令スケジューリングの両立は相当よくできているということである。
3時間くらい問題に特化した自作スケジューラ作ってたのだが、レジスタ足らない + スケジューリングがヘボイという状態であった…