2012-03-05 6 views
3

私の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> 
+0

アレイなしで同じことを試しましたか? –

+0

コンパイラとそのオプションは何ですか? – osgx

+0

私は実際に配列なしでそれを試していない、私はそれを行くことができます。私は瞬間に-O2でコンパイルするだけです – Ricky

答えて

3

パフォーマンスを6.4 GFLOPSにするには、CPUが1クロックで10命令を実行する必要があります。または展開されている場合は7つの命令。これはちょうど不可能です。このプロセッサでは、4命令/クロック以上は取得できません。

+0

ありがとう、それはすでに多くのことを確かに説明しています。別のコードでこのピークパフォーマンスに近づく方法はありますか? – Ricky

+0

はい、メモリの読み書きよりも多くの算術演算を行うと、より多くのFLOPSを得ることができます。例えば、a [i] * =(b [i] * b [i]); –

+1

@ DanLeakinあなたは[この質問を見てみましたか?](http://stackoverflow.com/questions/8389648/how-達成可能な4フロップ/サイクル)いくつか調整した後、OPは自分のコードをサイクルごとに1 add + 1 mulで実行することができました。 – Mysticial

2

大きなハウは、あなたのL3キャッシュのですか? 4 MB?だから、キャッシュのために少し余裕を持たせることができます。作業サイズを50%減らしてみてください。

FP操作の「並列処理」は、基本的にFP操作がトリガーされ、他の処理はまだ処理されていないことを意味します。しかし、あなたはほとんど登録SSEを使用してマルチスレッドのアプローチおよび/または

  • のいずれかを使用して

    • ずに本当の並列性を得るために管理していないでしょう。
  • +0

    L3キャッシュは8 MBです。私は問題のサイズを縮小しようとしましたが、実際にはパフォーマンスが改善されませんでした。 – Ricky

    +0

    この場合、並列処理を実際に利用したくないのですが、なぜFP操作の理論上のピークパフォーマンスに到達できないのか理解したいだけです。シングルスレッドで、sse命令はありません。あなたの反応をありがとう! – Ricky

    +0

    ホットループ用の(最適化された)マシン命令を投稿できますか? *や+だけではありません。さらに、レジスタのロードとデータの移動。彼らはコストも導入する。 –

    2

    CPUパイプラインを埋めるためにループアンローリングを使用しないでください。

    +0

    xにいくつかの値を指定して '#pragma unroll(x)'を使って試しましたが、少しだけ性能が向上します – Ricky

    +0

    xの値はどれですか? –

    +0

    2から1024までの2の倍数を試しました。 – Ricky

    関連する問題