是否有任何简单的性能测试来检测是否启用了 HT?例如,当最大 CPU 数量受 linux 内核(NR_CPUS)限制且无法访问 BIOS 时,我需要它。
那么你能建议任何代码来检测是否启用了 HT 吗?
还有另一种方式——/sys/ 文件系统,它应该比/proc 更有序。/proc/cpuinfo 因内核版本而异;
猫 /sys/devices/system/cpu/cpu0/topology/thread_siblings
为您提供与核心 cpu0 一起运行的硬件线程列表。
https://www.kernel.org/doc/Documentation/cputopology.txt
4) /sys/devices/system/cpu/cpuX/topology/thread_siblings:
internal kernel map of cpuX's hardware threads within the same
core as cpuX
在 Linux 上我认为你可以阅读/proc/cpuinfo
,但在那之后你必须做一些思考,看看我们是否有多核 cpu,或者启用了 HT 的 cpu 等。
首先,flags
将为您提供支持的功能,并且ht将指示超线程支持。
然后您必须检查兄弟计数是否与每个 CPU 上的核心计数匹配,因此查找 cpu id,并从那里扣除。(因此,如果兄弟计数与核心计数匹配 -> 无 HT)可以在此处找到更多信息:http ://richweb.com/cpu_info
检查标志会给你一个明确的答案,而性能测试(特别是如果以编程方式检查结果)会有一些不确定性。我们将测试的超线程 (HT) 签名的性能特征是什么?当线程执行不同的工作时,HT 提供更好的性能,其中不同是基于微架构定义的。相比之下,由于在每个内核上执行的代码,单独的内核几乎没有性能相关性(一些因素仍然存在,例如内存带宽或共享缓存)。
您可以测试多种组合;我将在这里勾勒出一种可能的解决方案。假设系统至少有两个内核也可能启用了 HT。这提供了可以在其上调度线程的 4 个逻辑处理器 (LP)。制作一个可以对一个内核资源施加压力的单线程程序。现在,复制该工作,这样我们将拥有两个可以独立运行的线程。然后为了测试性能,将线程的调度亲和性设置为系统中不同的 LP 对。然后测量在不同对上运行的性能。HT 对将提供与配对单独内核不同的性能。
在编写性能测试时,您通常会担心测量性能。测量机制是否具有必要的粒度?您正在测试的变量(HT 与核心)是否发生变化,但其他变量没有变化?例如,每次测试前缓存是否处于相同状态?或者,某些内核是否共享缓存,因此在测试中将它们配对会提供与其他配对不同的性能?现在,如果你做了所有这些,那么你应该观察到不同的性能结果,这取决于你安排了哪对 LP 工作。