假设我有一个具有18个内核的服务器cpu,并且启用了超线程,这意味着我可以在htop中看到36 cpus。
为了充分利用CPU而不影响单线程性能,我的目标是使所有36个“内核”都以100%运行,而HT内核只会做更少的工作而仍然报告100%,或者意味着“完整”核心已经被其“ HT核心”上的任务打断了,从而减少了单线程工作?
我知道有很多影响HT性能的变量,我只想知道CPU仪表在处理HT时的含义。
假设我有一个具有18个内核的服务器cpu,并且启用了超线程,这意味着我可以在htop中看到36 cpus。
为了充分利用CPU而不影响单线程性能,我的目标是使所有36个“内核”都以100%运行,而HT内核只会做更少的工作而仍然报告100%,或者意味着“完整”核心已经被其“ HT核心”上的任务打断了,从而减少了单线程工作?
我知道有很多影响HT性能的变量,我只想知道CPU仪表在处理HT时的含义。
Answers:
如果允许第二个虚拟核心在第一个虚拟核心卡住的情况下做出贡献,那总比没有好,因此(至少)您会完成一些额外的工作。
问题就变成了:什么时候拥有两个不同的线程会导致一个线程运行得更糟?分支预测和指令之间的依赖关系不会改变。现在正在等待内存访问...这两个线程在高速缓存利用率和带宽方面都在争夺内存访问。
如果您有一些运行HT的CPU而没有运行HT的CPU,这是否还意味着您将为一种类型或另一种类型分配特定的线程?我认为不是:您的程序将在随机虚拟内核上运行其线程。那么拆分配置有何帮助?由于每个CPU都有自己的缓存,因此唯一的影响是由于内存带宽和缓存一致性负担。
一般情况下,你达到一个点,有更多的东西,你可以做的是不是让一些CPU执行单元进入空闲状态更加昂贵。这不直接取决于线程数,而是取决于线程在做什么,以及各个组件的详细内存体系结构和性能细微差别。
没有简单的答案。即使考虑到特定的程序,该机器也可能与讲述自己的经历的人有所不同。
您必须自己尝试一下,并通过该特定机器上的特定工作来衡量最快的方法。即使这样,它也可能随着软件更新和使用情况的变化而改变。
看一下《愤怒》大号作品的第3卷。如果仔细查看某些特定的处理器,您会发现执行代码所需的许多步骤的深层管道中的资源有限。您需要找到一种情况,过度使用会导致执行速度变慢,而不是不进行更多工作。一般来说,这意味着某种缓存。以及线程之间共享资源的位置。
CPU计量器是什么意思:它报告所有花费在运行空闲线程上的时间。分配给内核的两个逻辑线程都不会处于空闲状态,即使在其中一个线程上完成的实际工作可能很小。直到完成结果准备,获取内存,对原子操作进行防护等,流水线停留了几个周期,同样也不会导致线程被搁置为“未就绪”,因此不会处于空闲状态,时间仍然显示为使用中。等待RAM不会显示为空闲。只有诸如I / O之类的东西才会使线程阻塞并停止为其充电。通常,操作系统互斥锁会这样做,但是随着多核系统的兴起,这不再是确定的事情,因为“自旋锁” 不会使线程回到货架上。
因此,如果CPU经常卡在等待内存中,那么100%的CPU表并不意味着一切顺利。较少的逻辑核心(占90%)很可能会完成更多工作,因为它完成了数字运算,现在正在磁盘上等待。
因此,不必担心CPU仪表。看实际取得的进展,只。
CPU指标很难告诉您可以从超线程CPU中挤出多少性能。为此,您应该以各种物理核心超额订购率运行自己的基准测试。在完全关闭HT的情况下,有些工作负载最适合工作,因此在测试中也要包括这种情况。可能是1:2(36个并行工作人员),1:1.5甚至是1:2.5!这取决于您的工作量。
更详细地说,在硅上实现HT的方式可以减少当上下文需要切换或分支预测失败时处理器空闲的时间。这比使用纯操作系统技巧更容易达到100%执行单元使用率。自从HT引入以来,它已经发展了,现代芯片上的并行性比我们十年前使用的更多。
有两个执行配置文件,这些配置文件将影响最佳的超额预订点:
实现超线程的方式因特定的CPU架构而异。从Nehalem到Skylake,Intel显着降低了管道的固定比率(即50/50)共享部分,转向了动态共享结构。
不管怎样,总的来说,使HT导致sligtly较慢的单线程执行,但由于如何Linux调度作品,这只有在数量或正在运行的线程是发生高比物理内核的数量。在这种情况下(当线程>内核时),您通常会重视最重要的总吞吐量,因此超线程仍然是赢家。
这怎么可能?要理解的关键点是,CPU不会将物理内核和虚拟内核呈现为相等的内核,而是以某种方式公开后者,Linux调度程序可以避免在任何其他物理内核可用的情况下对其进行调度。换句话说,它首先使用所有物理核心,然后开始使用虚拟核心。
通常,这意味着超线程是一项非常有价值的功能(其他处理器,例如Power8,也使用了更深的SMT技术),为了使吞吐量最大化,您应该启用它,从而在CPU中为每个虚拟或物理内核加载至少一个线程。举一个实际的例子,要从18核CPU提取全部性能,您至少应使用36个线程。
存在两个例外: