SandyBridgeベンチ

とりあえず手元にあった計測用コード使ってベンチ。i5-2400S(以下Sandy)です。

AVX

http://journal.mycom.co.jp/special/2011/sandybridge/002.html
AVXは128bitを二回実行とか書いてあるがデマなので騙されないように。
整数が性能変わらないのは、整数には256bit命令が無いから。
浮動小数はちゃんとクロックあたり1MUL+1ADD出ます。

#include <immintrin.h>
#include <x86intrin.h>

__m256d data[16];

int
main()
{
    int b, e;
    int i, j;
    int N = 1024;

    __m256d v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13;

    v0 = data[0];
    v1 = data[1];
    v2 = data[2];
    v3 = data[3];
    v4 = data[4];
    v5 = data[5];
    v6 = data[6];
    v7 = data[7];
    v8 = data[8];
    v9 = data[9];
    v10 = data[10];
    v11 = data[11];
    v12 = data[12];
    v13 = data[13];

    for (i=0; i<10; i++) {
        b = __rdtsc();
        for (j=0; j<N; j++) {
            v0 = _mm256_add_pd(v0, v0);
            v1 = _mm256_mul_pd(v1, v1);
            v2 = _mm256_add_pd(v2, v2);
            v3 = _mm256_mul_pd(v3, v3);
            v4 = _mm256_add_pd(v4, v4);
            v5 = _mm256_mul_pd(v5, v5);
            v6 = _mm256_add_pd(v6, v6);
            v7 = _mm256_mul_pd(v7, v7);
            v8 = _mm256_add_pd(v8, v8);
            v9 = _mm256_mul_pd(v9, v9);
            v10 = _mm256_add_pd(v10, v10);
            v11 = _mm256_mul_pd(v11, v11);
            v12 = _mm256_add_pd(v12, v12);
            v13 = _mm256_mul_pd(v13, v13);
        }
        e = __rdtsc();

        printf("%f\n", (e-b)/(double)N);
    }

    data[0] = v0;
    data[1] = v1;
    data[2] = v2;
    data[3] = v3;
    data[4] = v4;
    data[5] = v5;
    data[6] = v6;
    data[7] = v7;
    data[8] = v8;
    data[9] = v9;
    data[10] = v10;
    data[11] = v11;
    data[12] = v12;
    data[13] = v13;
}

メモリスループット

大体事前情報どおり。

L1が32[B/clk]出るのでかなり改善されてるように見える。

L3のスループットがコア数でスケールする…というのを確認したかったが確認できず。というか4コア動かすとスループット減ってるような。データの分散のルールがわからないとなんとも言えんが。
(追記:サイズ間違ってた。普通に4コアでスケールしてる)

キャッシュ外のメモリアクセスのスループットはNehalemのi3 530(以下NHM)と比べると倍近く改善されてるように見える。
DDR3 1333x2 で17.5[GB/s]出てるので、かなり理論値(21.3)に近い値ですね。

メモリレイテンシ

1GBにランダムアクセスして、

  • 依存しないロード
  • 依存するロード

をした時のレイテンシ。

依存しないときはNHMと殆ど変わらん。Sandyが31[ns]で、NHMが33[ns]。
依存してる時は、NHMが137.2[ns]で、Sandyが100[ns]ぐらい。
ちょっと速くなってる気がする。

ROB read port stalls

僕の認識が間違っていなければ、多分ROB read port stallsが改善されてる。

	paddd	%xmm0, %xmm1
	por	%xmm2, %xmm3
	lea	(%ebp, %eax), %ebx

こういうのがIPC3出る。

コア間通信

多分NHMと変わらん。500[clk]ぐらい。
(クロック違うのでnsでとったほうがいいのかも。NHMが170[ns]でSandyが200[ns])

相変わらずよくわからん

CoreMA系だけあって、実験してると理由を説明できない挙動をよく見かける。

	por	%xmm1, %xmm1
	pxor	%xmm4, %xmm4
	por	%xmm2, %xmm2

これが1.138[clk]で、

	por	%xmm1, %xmm1
	por	%xmm4, %xmm4
	por	%xmm2, %xmm2

これが1.05[clk]。xorでゼロクリアするのて改善されたんやないの?

まとめ

AVXで浮動小数性能が倍になってる点と、L1キャッシュおよびメモリアクセスのスループットがかなり改善されてる点を考えると、日常的に解析やシミュレーションやシュミレーションをしているご家庭やファミリーには必須だといえる。

それ以外はちょびっと改善されてる気配がある。