我正在尝试为我的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>
答案 0 :(得分:3)
为了提供6.4 GFLOPS的性能,您的CPU应该在一个时钟内执行10条指令。如果展开,则为7条指令。这是不可能的。此处理器上的指令/时钟不能超过4个。
答案 1 :(得分:2)
Howe large是你的L3缓存? 4 MB?因此,您可以为缓存提供更多空间。尝试将工作尺寸减少50%。
然而,FP操作中的“并行性”基本上意味着可以触发FP操作,而其他操作仍在处理而未完成。但是,如果没有
,你将很难获得真正的并行性答案 2 :(得分:2)
你不应该使用循环展开来填充CPU管道吗?