英特尔 Nehalem 单线程峰值性能

3
我正在尝试达到我的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>

你尝试过不使用数组来做同样的事情吗? - Karoly Horvath
你正在使用哪个编译器以及它的选项? - osgx
我实际上没有尝试过没有数组的情况,我可以尝试一下。目前我只使用 -O2 编译。 - Ricky
你尝试过使用其他函数(例如clock()getTimeOfDay)来计时操作吗? - Tudor
显示剩余7条评论
3个回答

3
为了达到6.4 GFLOPS的性能,你的CPU应该在一个时钟周期内执行10条指令。如果展开,则为7条指令。然而,这是不可能的。在这个处理器上,你最多只能获得每个时钟周期4条指令的执行速度。

谢谢,这已经解释了很多。有没有其他代码可以实现这种高性能的方法? - Ricky
是的,如果您执行更多的算术运算而不是内存读/写操作,则可以获得更多的FLOPS。例如,a[i] *= (b[i]*b[i]); c[i] = (a[i]+c[i]+b[i]); - Evgeny Kluev
1
@DanLeakin 你有没有尝试看一下这个问题?经过一些调整,OP设法让他的代码在每个周期运行1次加法和1次乘法。 - Mysticial

2

你的L3缓存有多大?4 MB吗?因此,你可能需要为缓存留出更多的余地。尝试将工作大小减少50%。

然而,在FP操作中的“并行性”基本上意味着在其他操作仍在处理和未完成时可以触发FP操作。但是,如果没有使用多线程方法和/或使用SSE寄存器,你很难实现真正的并行性。


L3缓存为8 MB。我尝试减小问题规模,但这并没有真正提高性能。 - Ricky
我并不真的想在这种情况下利用并行性,我只是想了解为什么我无法使用单个线程和没有SSE指令来达到FP操作的理论峰值性能。不过还是谢谢你的回应! - Ricky
你能发布热循环的(优化后的)机器指令吗?它不仅仅由 * 和 + 组成。此外,寄存器的加载和数据的移动也会带来成本。 - Haymo Kutschbach
谢谢,我已经在我的初始帖子中添加了热循环的汇编代码。但是由于迭代是独立的,编译器应该能够以流水线方式处理此代码并执行乘法和加法,对吧? - Ricky

2
你是否应该使用循环展开来填充CPU流水线呢?

我尝试使用#pragma unroll(x)并尝试了几个x的值,但这只稍微提高了性能。 - Ricky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接