什么原因导致并行代码的CPU负载低于100%?

时间:2012-10-16 11:47:31

标签: parallel-processing cpu mutex multicore ram

如果为多核CPU并行化代码以将此CPU加载到低于100%,那是否仅仅是因为I / O和互斥锁的期望?或者可能是因为缓存未命中并等待访问RAM或其他东西?

4 个答案:

答案 0 :(得分:0)

您的流程不会是唯一正在运行的流程。其他进程(包括操作系统内核)将消耗百分比。上下文切换,等待I / O和互斥体只是其中的一部分。

答案 1 :(得分:0)

我确信有很多很多可能的原因导致无法实现100%的CPU使用率,如果不了解您的环境,我们将无法确定具体原因。

如果你的CPU是超线程(HT),那么考虑的因素比其他一些CPU设计要多; CPU的某些部分是重复的,这意味着操作系统将您的物理内核视为多个逻辑内核,这些逻辑内核就像任务管理器所显示的那样。在某些情况下,CPU的非重复部分可能会成为瓶颈,这可能意味着重复的组件无法以100%的使用率运行。

有趣的是,即使逻辑内核的数量增加了一倍,英特尔的HT CPU状态与非HT CPU相比也只有大约30%的性能提升。

答案 2 :(得分:0)

我不知道我是否理解你的问题的要点所以我会假设你问为什么你的多线程应用程序没有使用核心上100%的CPU可用功率。

我在编写多线程shell排序时经历了类似的事情,它使用了50%的可用容量(两个核心为50%),即使在其他情况下也没有发生,即我期望它在两个核心上都使用100%。

我通过使用亲和功能将线程绑定到特定核心来纠正问题。在双核机器上,只会创建两个线程。排序现在可以使用任意数量的核心(虽然它不会扩展到超过三个核心)并以100%运行所有核心。与排序工作相比,操作系统和相关流程所做的工作微不足道。由于线程绑定到核心,因此操作系统在管理它们时几乎没有选择/很少做。

答案 3 :(得分:0)

Amdahl的法律和同步开销将是我的第一个嫌疑人。只要你有某种同步或线程管理,就会一直发生。

如果我们假设这接近零,那么在这个线程中提出的所有其他事情都可能就是这样。 IO,缓存,操作系统干扰,HT等硬件问题(如果在Intel x86上),......

测试这一点的一个好方法是将程序移动到不同类型的体系结构(Intel,AMD,Power,Sparc,HT,非HT)和操作系统上运行,并查看行为是否发生变化。这往往以非常有效的方式揭示该计划的核心行为。