创建线程时设置CPU关联

 ftwinkle 发布于 2023-01-04 14:01

我想创建一个C++ 11线程,我希望它在我的第一个核心上运行.我发现pthread_setaffinity_np并且sched_setaffinity可以更改线程的CPU亲和性并将其迁移到指定的CPU.但是,在线程运行后,此关联性规范会发生更改.

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

如果在初始化C++ 11线程时无法指定关联,那么如何pthread_t在C中执行?

我的环境是Ubuntu上的G ++.一段代码表示赞赏.

1 个回答
  • 我很抱歉在这里成为"神话破坏者",但设置线程亲和力非常重要,随着时间的推移它越来越重要,因为我们所使用的系统本质上变得越来越多的NUMA(非统一内存架构).如今,即使是一个简单的双插槽服务器也会将RAM单独连接到每个插槽,并且从插槽到其自己的RAM访问存储器与相邻处理器插槽(远程RAM)的存储器的差异很大.在不久的将来,处理器正在进入市场,其中内部核心集合本身就是NUMA(用于单独核心组的独立存储器控制器等).我没有必要在这里重复其他人的工作,只需在线查找"NUMA和线程亲和力" - 您可以从其他工程师的多年经验中学习.

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

    因此,总而言之,在具有更重要的体系结构的系统上运行代码时,亲和设置接口非常重要 - 这些日子正迅速成为"任何系统".一些线程运行时环境/库允许在运行时控制它而无需任何特定的编程(参见OpenMP,例如在英特尔的KMP_AFFINITY环境变量的实现中) - 对于C++ 11实现者来说,包含类似的机制是正确的.他们的运行时库和语言选项(在此之前,如果您的代码旨在用于服务器,我强烈建议您在代码中实现关联控制)

    2023-01-04 14:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有