C++ 超线程如何影响并行化?

C++ 超线程如何影响并行化?,c++,multithreading,parallel-processing,openmp,hyperthreading,C++,Multithreading,Parallel Processing,Openmp,Hyperthreading,我正在超线程CPU上使用一个OpenMP代码 如果所有其他条件都相同,在非超线程CPU上性能会发生怎样的变化 我注意到,无论运行多少线程,处理器利用率都是100%,但更改线程数确实会提高性能。这怎么可能 非英特尔多线程CPU的情况也一样吗?超线程带来的性能改善(如果有的话)很难预测 超线程意味着,如果一个线程由于(几乎)任何原因暂停,CPU将有一个来自另一个线程的指令池来(尝试)执行。即使没有实际的暂停,如果调度使用不同执行资源的两个线程,那么来自这两个线程的指令也可以在同一个内核上同时执行。因

我正在超线程CPU上使用一个
OpenMP
代码

如果所有其他条件都相同,在非超线程CPU上性能会发生怎样的变化

我注意到,无论运行多少线程,处理器利用率都是100%,但更改线程数确实会提高性能。这怎么可能


非英特尔多线程CPU的情况也一样吗?

超线程带来的性能改善(如果有的话)很难预测

超线程意味着,如果一个线程由于(几乎)任何原因暂停,CPU将有一个来自另一个线程的指令池来(尝试)执行。即使没有实际的暂停,如果调度使用不同执行资源的两个线程,那么来自这两个线程的指令也可以在同一个内核上同时执行。因此,例如,如果代码严重依赖于主内存延迟(例如,不带预取的不可预测的读取模式),超读取可能会大幅提高性能

在另一个方向上,如果通过仔细使用缓存、预取等来仔细编写代码以覆盖延迟,那么它可能从超读中获得很少或什么也得不到。特别是对于在线程调度中不考虑超线程的旧操作系统,额外的线程实际上会导致额外的上下文切换,从而降低总体执行速度


假设您从完全单线程代码开始,并添加一些OpenMP指令,我自己的经验是,超线程通常有助于提高性能,大约10%。如果代码几乎试图完善或任何类似的功能,那么大部分(如果不是全部)优势几乎会立即消失。

我刚刚发现可以在BIOS中禁用超线程。这就是你决定改进的方式吗?@roro:我通过在BIOS中禁用超线程、手动将线程数限制在已知可用的物理内核数以及手动调整线程亲和力两种方式进行了测试。我同意HT的性能改进很难预测。但是,所有执行资源直到暂停时才被使用。相反,执行资源(端口、缓存等)在超线程之间共享。因此,HT 1的addμop可以在Haswell端口0上执行,而HT 2的leaμop可以在相同的时钟周期内在端口5上执行。引用Intel的话,“从微体系结构的角度来看,这意味着来自两个逻辑处理器的指令将在共享执行资源上保持并同时执行。”我认为HT的目的是在执行资源级别提高资源利用率。