gpt4 book ai didi

c++ - 创建线程时设置 CPU 亲和性

转载 作者:可可西里 更新时间:2023-11-01 15:48:41 26 4
gpt4 key购买 nike

我想创建一个 C++11 线程,我希望它在我的第一个核心上运行。我发现 pthread_setaffinity_npsched_setaffinity 可以改变线程的 CPU affinity 并将其迁移到指定的 CPU。但是,此关联规范会在线程运行后发生变化。

如何创建具有特定 CPU 亲和性的 C++11 线程(cpu_set_t 对象)?

如果在初始化 C++11 线程时无法指定亲缘关系,如何使用 C 中的 pthread_t 来实现?

我的环境是 Ubuntu 上的 G++。感谢一段代码。

最佳答案

很抱歉成为这里的“流言终结者”,但是设置线程亲和性非常重要,随着我们使用的系统本质上变得越来越 NUMA(非统一内存架构),它的重要性会随着时间的推移而增加.如今,即使是普通的双插槽服务器也有单独连接到每个插槽的 RAM,从一个插槽到它自己的 RAM 与相邻处理器插槽(远程 RAM)的内存访问差异很大。在不久的将来,处理器正在进入市场,其中内部内核组本身就是 NUMA(用于单独的内核组的单独内存 Controller 等)。其他人的工作我这里就不用赘述了,网上找《NUMA与线程亲和性》就可以了,其他工程师多年的经验可以借鉴。

不设置线程关联实际上等于“希望”操作系统调度程序正确处理线程关联。让我解释:您有一个带有一些 NUMA 节点(处理和内存域)的系统。你启动一个线程,线程用内存做一些事情,例如malloc 一些内存,然后处理等。现代操作系统(至少 Linux,其他可能也是)到目前为止做得很好,默认情况下,内存是从运行线程的 CPU 的同一域分配的(如果可用) .时间到了,分时操作系统(所有现代操作系统)将使线程休眠。当线程重新进入运行状态时,它可能会在系统中的任何核心上运行(因为您没有为其设置关联掩码),并且您的系统越大,它在远离它先前分配或使用的内存的 CPU 上被“唤醒”的机会就越高。现在,您的所有内存访问都将是远程的(不确定这对您的应用程序性能意味着什么?在线阅读有关 NUMA 系统上的远程内存访问的更多信息)

因此,总而言之,当在具有超凡架构的系统上运行代码时,亲缘关系设置接口(interface)非常重要——这些天正迅速成为“任何系统”。一些线程运行时环境/库允许在运行时对此进行控制而无需任何特定编程(参见 OpenMP,例如在英特尔对 KMP_AFFINITY 环境变量的实现中)——对于 C++11 实现者来说,将类似的机制包含在它们的运行时库和语言选项(在此之前,如果您的代码旨在用于服务器,我强烈建议您在代码中实现亲和性控制)

关于c++ - 创建线程时设置 CPU 亲和性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com