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

标签 c++ multithreading parallel-processing openmp hyperthreading

我在超线程 CPU 上使用 OpenMP 代码。

如果其他条件都相同,在非超线程 CPU 上性能会如何变化

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

非 INTEL 多线程 CPU 的情况是否相同?

最佳答案

超线程带来的性能提升(如果有的话)很难预测。

超线程意味着如果一个线程由于(几乎)任何原因而停止,CPU 将有一个来自另一个线程的指令池来(尝试)执行。即使没有真正的停顿,如果两个线程被安排使用不同的执行资源,来自两个线程的指令也可以在同一个内核上同时执行。因此,例如,如果代码严重依赖于主内存延迟(例如,没有预取的不可预测的读取模式),超线程可能会显着提高性能。

另一方面,如果通过谨慎使用缓存、预取等方式仔细编写代码以覆盖延迟,那么它可能从超线程中获益甚微或一无所获。特别是对于不尝试在其线程调度中考虑超线程的旧操作系统,额外的线程实际上会导致额外的上下文切换,从而减慢整体执行速度。

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

关于c++ - 超线程如何影响并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35355944/

相关文章:

c# - 并行调试

c++ - 文件中模板类的静态数据成员的初始化顺序是什么?

c++ - 结构 vector C++

c# - 在非静态类中,如何保留在多个不同类中同时调用的静态方法中使用的静态变量的值

c - 在 C 上使用 pthreads 实现屏障

python - 使用多处理模块在进程之间传递消息

c++ - 打开 GL : is this the right way of using VBO IBO and VAO

c++ - 在参数和返回类型上重载函数

multithreading - WCF服务契约实现中的多线程操作

multithreading - 关于游戏循环、滴答和实时编程的一些问题