最新Xeons上的FP密集型超线程性能

ava*_*lys 6 floating-point optimization performance multithreading hyperthreading

我们最近购买了一台双Intel X5650工作站,在Ubuntu 10.04下运行浮点密集型仿真.

每个X5650都有6个内核,因此共有12个内核.这些代码非常平行,所以我主要用12个线程运行它,并通过"top"观察大约"1200%"的处理器利用率.

在BIOS中启用了超线程,因此操作系统名义上可以看到24个可用核心.如果我将线程数增加到24,则top报告大约2000%的处理器利用率 - 但是,实际代码性能似乎没有增加20/12.

我的问题是 - HyperThreading如何在最新一代的Xeon上实际运行?浮点密集型代码是否会因为每个核心调度多个线程而受益?如果工作集大小与高速缓存大小相比,答案会更改,相比之下要大几倍,或者是否存在大量I/O操作(例如,将模拟输出写入磁盘)?

另外 - 当启用超线程时,我应该如何解释"顶部"的处理器利用率百分比?

Jes*_*all 6

使用HT,操作系统将同时为每个核心安排2个线程.top报告的利用率基本上只是在其采样间隔(通常为1秒)内处于"运行"状态的平均线程数.运行线程可供CPU执行,但可能无法完成大量工作,例如,如果它们在缓存未命中时大多停滞不前.

当一个线程在真正的I/O上被阻塞 - 网络,磁盘等 - 操作系统将从核心中取消它并安排其他一些准备好的线程,因此HT无法提供帮助.

HT试图从数学执行单元中获得更多的利用率而不会实际加倍核心中的硬件.如果一个线程具有足够的指令级并行性并且不会错过很多缓存,那么它将主要填满核心的资源而HT将无济于事.对于数据不适合缓存的重型FP应用程序,HT仍然可能无济于事,因为两个线程都使用相同的执行单元(SSE数学)并且两者都需要比完整缓存更多 - 事实上它很可能因为他们将竞争缓存和捶打更多而受到伤害.当然,这取决于您正在做什么以及您的数据访问模式是什么样的.

HT主要用于具有不规则和不可预测的访问模式的分支代码.对于FP密集型代码,您通常可以在每个内核使用1个线程并仔细设计访问模式(例如良好的数据阻塞)方面做得更好.