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より速い → AtomSIMD倍精度はパイプライン止まるので超遅い


あと、使ってる印象だと、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が全然違うのなんで?AMDIntelで定義違うんだっけ?)

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%減だけを考えるべきか。ブラウザのベンチマークとか動かすとよいのかも。そのうち。