如果多核 CPU 并行化代码使这个 CPU 加载到 100% 以下,难道仅仅是因为 I/O 和 mutex 的期望?或者可能是因为缓存未命中并等待访问 RAM 或其他原因?
4 回答
您的进程不会是唯一运行的进程。包括操作系统内核在内的其他进程将消耗大量百分比。上下文切换、等待 I/O 和互斥体只是其中的一部分。
Amdahl 定律和同步开销将是我的第一个怀疑对象。只要您有某种同步或线程管理,就会一直发生。
如果我们假设这接近于零,那么这个线程中提出的所有其他事情都可能是它。IO、缓存、操作系统干扰、HT 等硬件问题(如果在 Intel x86 上)...
测试这一点的一种好方法是移动程序以在不同类型的架构(Intel、AMD、Power、Sparc、HT、非 HT)和操作系统上运行,并查看行为是否发生变化。这往往以非常有效的方式揭示程序的核心行为。
我确信有很多可能的原因导致 CPU 使用率无法达到 100%,如果不了解您的环境,我们将无法确定确切的原因。
如果您的 CPU 是超线程 (HT),则比其他一些 CPU 设计要考虑更多;CPU的某些部分是重复的,这意味着操作系统将您的物理核心视为多个逻辑核心,这些逻辑核心就是任务管理器之类的显示。在某些情况下,CPU 的非重复部分可能会成为瓶颈,这可能意味着重复的组件无法以 100% 的使用率运行。
有趣的是,HT CPU 是 Intel 的状态,与非 HT CPU 相比,即使逻辑内核的数量翻了一番,性能也只有大约 30% 的提升。
我不知道我是否理解您问题的要点,所以我假设您在问为什么您的多线程应用程序不使用内核上可用的 100% 的 CPU 功率。
我在编写一个使用 50% 可用容量(两个核心占 50%)的多线程 shell 排序时遇到了类似的情况,即使没有其他事情发生,即我希望它在两个核心上都使用 100%。
我通过使用关联函数将线程绑定到特定内核来纠正这个问题。在双核机器上,只会创建两个线程。该排序现在可以使用任意数量的内核(尽管它不会扩展到超过三个内核)并以 100% 的速度运行所有内核。与排序所做的工作相比,操作系统和相关进程所做的工作是微不足道的。由于线程与内核相关联,因此操作系统在管理它们时几乎没有选择/几乎无事可做。