如何在C++中区分高性能和低性能内核/线程?

人气:1,011 发布:2022-10-16 标签: performance multithreading c++ intel apple-m1

问题描述

在谈到多线程时,线程似乎经常被视为平等--与主线程相同,但在它旁边运行。

然而,在一些新的处理器上,如Apple "M" series和即将推出的英特尔Alder Lake系列,并非所有线程都具有同等的性能,因为这些芯片具有单独的高性能内核和高效率、较慢的内核。

这并不是说现在还没有超线程之类的东西,但这似乎具有更大的性能影响。

有没有办法查询std::thread的属性并强制执行它们将在C++中运行的内核?

推荐答案

如何在C++中区分高性能核/线程和低性能核/线程?

请理解,线程是硬件功能的抽象,您无法控制的东西(操作系统、内核的调度程序)负责创建和管理这种抽象。重要程度和性能提示是该抽象的一部分(通常以线程优先级的形式表示)。

任何破坏线程抽象的尝试(例如,确定内核是低性能内核还是高性能内核)都是错误的。例如,操作系统可能会在您发现您在高性能内核上运行后立即将您的线程更改为低性能内核,这会导致您认为您在高性能内核上运行,而实际上并非如此。

即使将线程固定到特定的核心(希望它始终使用高性能核心)也可能/将适得其反(导致您完成的工作较少,因为当高性能核心忙于执行其他工作时,您已经阻止自己使用低性能核心。&q;最大的问题是,C++在操作系统提供的可能更好的抽象之上创建了一个更差的抽象(std::thread)。具体地说,无法使用std::thread设置、修改或获取线程优先级;因此您无法控制做出正确的负载、性能和电源管理决策所必需的性能提示和性能提示。

在谈到多线程时,通常将线程视为平等的

人们通常认为我们仍在使用20世纪60年代的分时系统。别再听这些傻瓜的话了。现代系统不允许将CPU时间浪费在不重要的工作上,而更重要的工作在等待。有效利用线程优先级是一项基本的性能要求。其他所有内容(负载与性能、电源管理与决策)必然超出您的控制范围(位于您正在使用的线程抽象的另一边)。

162