一台计算机有2个物理核心和4个逻辑核心(例如,配备i5-3210M处理器的计算机)。
当程序A运行时,顶部显示其中 1 个核心使用了 100%,其他 3 个核心几乎处于空闲状态。此情况下的吞吐量为 X。
我的问题是,如果我在 4 个逻辑核心上运行 4 个 A 实例,那么总吞吐量是 4 倍还是 2 倍?如果我只运行两个实例会怎样?
答案1
概念核心没那么简单。逻辑核心是物理核心乘以线程可以在每个核心上运行。这被称为超线程。如果我的计算机有 4 核处理器,每个核心运行两个线程,那么我就有 8 个逻辑处理器。您可以通过运行来查看计算机的核心功能处理器命令。
如果一个处理器有 4 个核心,但它可以并行运行 8 个线程,这意味着它只有 4 个物理核心(处理单元)。但它的硬件可以支持最多 8 个线程平行线。显然,最多 4 个作业可以在核心中运行。核心中运行的一个作业,如果以任何方式停滞记忆或者I/O操作那么另一个线程可以使用该空闲的核心。
你现在应该明白了,如果你的计算机有 2 个物理核心,并且每个核心可以运行 2 个线程,那么你就有 4逻辑处理器。因此,由于您有 2 个物理核心,因此您只能运行 2 个实例,这意味着您正在使用单个物理核心的全部功能(一次 2 个线程)。因此吞吐量将为 50%。但如果任何时候一个线程处于空闲状态,则核心可以在该核心上加载一个线程。
您可以关闭超线程在BIOS(就像是 ”英特尔 HT 技术“),并查看普通功能和超线程功能之间的差异,因为现在吞吐量将达到 100%。
答案2
答案3
如果程序没有办法协调单独的实例,那么您几乎肯定不会得到任何改进。
例子:
如果我有一个单线程程序来计算 2 到 10 之间的质数,则运行该程序的单个实例将计算 2 到 10 之间的每个数字是否为质数,并发现 2、3、5、7 是质数。
如果我添加第二个实例而不对代码进行任何修改,第一个实例将计算 2-10 中的每个数字是否为质数,并发现 2、3、5、7 是质数,而第二个实例将计算 2-10 中的每个数字是否为质数,并发现 2、3、5、7 是质数。
这样做会导致同样的工作重复做两次,并且不会带来任何改进。