Intel Nehalem单线程峰值性能

时间:2012-03-05 12:05:05

标签: multithreading performance intel sse

我正在尝试为我的nehalem cpu达到单线程FP峰值性能,以检测我的应用程序的性能异常,但我似乎无法达到它。时钟速度为3.2 GHz,我希望在不使用SSE指令和多线程的情况下实现cpu的峰值FP性能。

据我所知,单精度FP加法和乘法可以在每个时钟周期并行完成,产生的最大性能为2 * 3.20 = 6.4 GFLOPS / sec。

但是,我无法用一段简单的代码达到这种性能:

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)));

这段代码给我的表现为:~1.5 GFLOPS而不是6.4 GFLOPS。

任何人都有其他任何可以在不使用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>

3 个答案:

答案 0 :(得分:3)

为了提供6.4 GFLOPS的性能,您的CPU应该在一个时钟内执行10条指令。如果展开,则为7条指令。这是不可能的。此处理器上的指令/时钟不能超过4个。

答案 1 :(得分:2)

Howe large是你的L3缓存? 4 MB?因此,您可以为缓存提供更多空间。尝试将工作尺寸减少50%。

然而,FP操作中的“并行性”基本上意味着可以触发FP操作,而其他操作仍在处理而未完成。但是,如果没有

,你将很难获得真正的并行性
  • 使用多线程方法和/或
  • 使用SSE寄存器。

答案 2 :(得分:2)

你不应该使用循环展开来填充CPU管道吗?