我正在尝试达到我的Nehalem CPU的单线程FP峰值性能,以检测我的应用程序的性能异常,但似乎无法达到。时钟速度为3.2 GHz,我想在不使用SSE指令和多线程的情况下实现CPU的峰值FP性能。
据我理解,每个时钟周期可以并行执行单精度FP加法和乘法,最大性能可达2 * 3.20 = 6.4 GFLOPS / sec。
然而,我无法通过一个简单的代码段达到这种性能:
这段代码的性能为约1.5 GFLOPS,而不是6.4 GFLOPS。有没有其他示例可以接近峰值性能而不使用MT和SSE,或者有任何想法可以改进我的代码?谢谢。*更新:添加了热循环的汇编代码:*
据我理解,每个时钟周期可以并行执行单精度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>
clock()
或getTimeOfDay
)来计时操作吗? - Tudor