E350のmulpsがレイテンシ2ってほんまか
適当に思い付くベンチマークを動かしてみたが、mulpsのレイテンシが2にしか見えなくてほんまかよ…addpsの3より短い。いや…信じ難いのだけど…。mulssとaddssでも一緒。
;; ... 2: rdtsc push %eax mov $NLOOP, %eax .align 16 1: movaps (value), %xmm0 .rept NUMINSN mulps %xmm1, %xmm0 .endr dec %eax jnz 1b rdtsc ;; ... .align 16 value: .float 9.1, 1.0000001, 1.0, 0.99999999
こんな感じので、NUMINSN = 32, NLOOP = (4096*128)。まあ、いくつかの例外を除くと、加算は、指数部→仮数部→指数部という依存があるのに対して、乗算は、仮数部→指数部という依存しかないことを考えると、レイテンシ3と2は、理解できなくもない…ほんまかよ。
なんかついでに他のも測ってみた。
これ では、「メモリ周りがうんこ」という結論になってるがほんまかいな?手もとのメモリベンチを動かした結果を見ると、メモリ周りはAtom比で同じかちょっと良いくらいという印象だが。あと4gamerの話は
- Atomもパイプ二本ある。パイプ構成はほぼ同じで二本のパイプで、整数x2、 FPADD, FPMUL のどれかふたつが使える。
- 「浮動小数が64bit」って、SSE128bit演算できないっていう意味で、常識的に考えてx86が80bit浮動小数持たないとは思えないけど
- 「フレームレートに現れないもっさり感」て2chかよ
あたりあやしいけど…
4gamerの「Atomより速かったり遅かったり」という結果は、「部分ごとはAtomよりまともだけど、SSE128bit演算ができない」というので、大体説明できるのではないかと思う。
- メモリが遅い → AIDA64が何を計測してるか知らんが、SSE128bitでL1にアクセスするとAtomのほうが倍速いので、そういうのが出てるのでは
- DoubleがAtomより速い → AtomのSIMD倍精度はパイプライン止まるので超遅い
あと、使ってる印象だと、Atomよりも体感で大分良い、という感じなのだけど、まあ、一応Linuxのビルドの時間をとってみた。
E350
Performance counter stats for 'make -j4': 1032881.239161 task-clock-msecs # 1.979 CPUs 329582 context-switches # 0.000 M/sec 7735 CPU-migrations # 0.000 M/sec 18878814 page-faults # 0.018 M/sec 1605104743940 cycles # 1554.007 M/sec (scaled from 68.48%) 973775121059 instructions # 0.607 IPC (scaled from 68.50%) 217206096335 branches # 210.291 M/sec (scaled from 68.51%) 12257699860 branch-misses # 5.643 % (scaled from 68.57%) 317511197834 cache-references # 307.403 M/sec (scaled from 68.44%) 14111937812 cache-misses # 13.663 M/sec (scaled from 68.44%) 521.956335281 seconds time elapsed
D510
Performance counter stats for 'make -j8': 2420620.729522 task-clock-msecs # 3.875 CPUs 588810 context-switches # 0.000 M/sec 11567 CPU-migrations # 0.000 M/sec 19058423 page-faults # 0.008 M/sec 3941313647863 cycles # 1628.224 M/sec (scaled from 72.26%) 978436492066 instructions # 0.248 IPC (scaled from 81.29%) 219717367821 branches # 90.769 M/sec (scaled from 80.85%) 28712460962 branch-misses # 13.068 % (scaled from 79.81%) 53994384363 cache-references # 22.306 M/sec (scaled from 20.60%) 5388879685 cache-misses # 2.226 M/sec (scaled from 21.14%) 624.734226659 seconds time elapsed
521秒と624秒…16%ぐらいか。ギリギリ体感できるぐらいかな…「大分良い」という感じは、プラシーボが入ってそうだな。
(cache-referencesとcache-missesが全然違うのなんで?AMDとIntelで定義違うんだっけ?)
IPCは…Atomのほうは、HT付いてるので、x2だとして、0.6と0.5か。HT付けない場合だと…(あ、データ取り損ねた。値は目視)
make -j4 800.651273929 sec 2545073810687 1618.917 M/sec (cycles) 980390252941 0.385 ipc (instructions) 218663006695 139.091 M/sec (branches) 24340432414 11.131 % (branch-misses) 34186910452 21.746 M/sec (cache-reference) 3100036387 1.972 M/sec (cache-misses)
512秒と800秒で35%か。まあ、体感で十分速いと感じれるぐらいだな。シングルスレッドプログラムならAtomより速いと感じてもプラシーボではないだろう。
(超どうでもいいが、僕は「気のせいだろ」という感じの文脈で「プラシーボだろ」ってよく言うのだけど、プラシーボ効果って実際に効果があるのだから、用法としては間違ってる)
いまどきのベンチマークは、SSE128bitには対応してあるだろうから、そういうのだけ見ると、「Atomとあんま変わらん。というかAtomより遅い」ってなってしまいそうだけど、APU的には、SIMDで書けるようなプログラムは、GPUで動かしてくれ、という感じなので、対等な比較をするなら、
- スカラ性能で比較
- SSE 128bitと、GPGPUで比較
で、比較すべきではないだろうか。例えば、OpenCLのサンプルに入っていたGlobalMemoryBandwidthによると、
Global Memory Read AccessType : linear(uncached) VectorElements : 4 Bandwidth : 9.10738 GB/s Global Memory Write AccessType : linear VectorElements : 4 Bandwidth : 9.71521 GB/s
とのことなので、これはDDR3-667の理論値(10.7[GB/s])や、AtomのDDR3-667のスループット(4[GB/s])を考えると、相当良い値ではないかと思う。もちろんGPUのピーク性能 80[GFLOPS]も忘れてはいけない。Atom 2コアのピーク性能は、1.6[GHz]で 25.6[GFLOPS]である。
と、いうのとかと、3Dという意味でのGPUがGMA3150やG45よりもずっとマシなのと、デジタル出力が付いてるのとか、を、色々考えると、まあ、そこそこよくできてるのではないかという印象を持ちそう。
もちろん、GPGPUのプログラムなんて地球に存在しないので、実際にはそんなことないのだが。それを言うなら、SSE128bitに対応したプログラムは地球にどれほど存在するのか?という感じなので、スカラ処理時間Atom比35%減だけを考えるべきか。ブラウザのベンチマークとか動かすとよいのかも。そのうち。