提问人:user2023370 提问时间:11/2/2023 最后编辑:user2023370 更新时间:11/3/2023 访问量:99
如何设置线程亲和性到性能或高效内核?
How to set thread affinity to either performance or efficient cores?
问:
我熟悉用于设置线程想要运行的 cpu。在下面的代码中,线程请求执行(设置为 13),方法是通过宏设置 affinity mask 来执行。pthread_attr_setaffinity_np
t
cpu_target
cpuset
CPU_SET
#include <pthread.h>
#include <sys/sysinfo.h>
int main(int argc, char *argv[])
{
pthread_attr_t attr;
pthread_t t;
cpu_set_t cpuset;
const int cpu_target = 13;
if (cpu_target >= get_nprocs_conf())
return -1;
CPU_ZERO(&cpuset);
CPU_SET(cpu_target, &cpuset);
pthread_attr_init(&attr);
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
pthread_create(&t, &attr, [](void*) -> void* { return nullptr; }, nullptr);
pthread_join(t, nullptr);
pthread_attr_destroy(&attr);
return 0;
}
我们可以询问有多少个内核可用。如果有可用的内核,我们可以将每个线程的关联掩码设置为在内核上运行 从 到 。N
0
N-1
现在,许多处理器都具有高性能和高效的内核。例如,i9-14900K 有 24 个核心(8 个性能核心和 16 个高效核心);8 个性能核心,每个核心能够运行 2 个超线程。
如何为性能核心配置线程关联性;还是效率核心?
答:
如何为性能核心配置线程关联性;还是效率核心?
C、C++ 或 POSIX 没有定义用于区分具有不同特征的执行单元的标准接口。事实上,它本身就是一个非标准的GNU扩展。*其他环境可能提供类似的接口,但在问题的通用性层面上 - 即不指定特定环境 - 主要答案是没有标准方法来控制程序在哪些执行单元上运行。pthread_attr_setaffinity_np()
第二个答案是,在大多数情况下,你不需要这样做。对于您正在谈论的 CPU 设计类型,一个关键的使能技术是内置逻辑,用于自动选择任何给定线程应该在哪些内核上运行。展望未来,我们也可以合理地预期,编译器将很快在生成代码方面做得更好,从而帮助此类 CPU 做好这项工作,并且操作系统内核将很快学会如何充分利用此类 CPU。只有当你有非常特殊的需求时,才有可能将时间和金钱投入到你所描述的那种手动核心亲和力管理中。
但是,如果您确实有这样的需求,并且我们可以安全地从您的 Glibc 依赖项中得出结论,您正在寻找特定于 Linux 的解决方案,那么这可能是解析以确定系统 CPU 内核的特征。然后使用该信息选择要为其设置关联性的核心。/proc/cpuinfo
*相关函数 sched_setaffinity() 也是如此。
评论
void*
std::thread
pthread_attr_setaffinity_np
_np