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でゼロクリアするのて改善されたんやないの?