私のnehalem cpuで、アプリケーションのパフォーマンス異常を検出するためのシングルスレッドFPピークパフォーマンスに到達しようとしていますが、到達できないようです。クロック速度は3.2GHzです。SSE命令とマルチスレッドを使用せずにCPUのピークFP性能を達成したいと考えています。Intel Nehalemシングルスレッドピークパフォーマンス
単精度FPの加算と乗算を各クロックサイクルで並列に行うことができますので、2 * 3.20 = 6.4 GFLOPS /秒の最大性能が得られます。
は、しかし、私は、コードのシンプルな作品で、このパフォーマンスに到達することはできませんよ。〜1.5 GFLOPSの代わりに、6.4 GFLOPS:コードの
int iterations = 1000000;
int flops_per_iteration = 2;
int num_flops = iterations * flops_per_iterations;
for(int i=0; i<iterations; i++)
{
a[i] = i;
b[i] = i*2;
c[i] = i*3;
}
tick(&start_time);
for(int i = 0; i < iterations; i++){
a[i] *= b[i];
c[i] += b[i];
}
time = tock(&start_time);
printf("Performance: %0.4f GFLOPS \n", flops/(time*pow(10,-3)*pow(10,9)));
この作品は私のパフォーマンスを提供します。
MTやSSEを使わずにピーク性能に近づくことができる他の例はありますか?
事前
のおかげで*更新:ホットループの追加アセンブリコード:*
Address Assembly
Block 17:
0x4013a5 movssl (%rdi,%rax,4), %xmm2
0x4013aa movssl (%r8,%rax,4), %xmm0
0x4013b0 movssl (%rsi,%rax,4), %xmm1
0x4013b5 mulss %xmm2, %xmm0
0x4013b9 addss %xmm1, %xmm2
0x4013bd movssl %xmm0, (%r8,%rax,4)
0x4013c3 movssl %xmm2, (%rsi,%rax,4)
0x4013c8 inc %rax
0x4013cb cmp %rcx, %rax
0x4013ce jb 0x4013a5 <Block 17>
アレイなしで同じことを試しましたか? –
コンパイラとそのオプションは何ですか? – osgx
私は実際に配列なしでそれを試していない、私はそれを行くことができます。私は瞬間に-O2でコンパイルするだけです – Ricky