首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++程序中实现具有拓扑考虑的多核HT的亲和性?

如何在C++程序中实现具有拓扑考虑的多核HT的亲和性?
EN

Stack Overflow用户
提问于 2011-10-19 01:54:50
回答 4查看 1.8K关注 0票数 1

我正在开发一些具有可变线程数量的C++多核程序,我想知道如何设置适当的(实际上是“最好的”)亲和力。我使用了Boost-thread,所以我可以调用get_hardware_concurrency()来知道有多少个逻辑核心。到目前为止,我编写了一个"n_th线程到第n个逻辑核心“的映射,但由于有多套接字处理器和HyperThreading,这不是最明智的做法。我的程序总是类似SIMD的,所以线程之间没有什么可共享的,在HT计算机的情况下,我想以我能想象到的最智能的方式将线程绑定到逻辑核心:第一个逻辑核心在第一个物理上,第一个逻辑在第二个物理上,...,第一个逻辑在第n个物理上,第二个逻辑在第一个物理上,依此类推。

我发现了很多东西,其中讨论了如何发现HT是否启用(CPUID)以及如何确定每个包的逻辑和物理核心。我知道我必须处理一些汇编代码,这并不会吓到我,但我真的不知道如何了解关于逻辑核心、物理核心和软件包的完整信息,以及操作系统如何处理所有这些信息。

简明扼要地说:我如何才能知道操作系统(Windows和Linux)引用为N-th的线程的确切位置(物理核心和包)?

EN

回答 4

Stack Overflow用户

发布于 2011-10-19 04:37:31

下面是一段代码片段,将为您提供Linux上的CPU拓扑。

代码语言:javascript
复制
#!/bin/bash
function filter {
  cat /proc/cpuinfo | grep -E "$1.*: [0-9]*" | sed -e 's/^.*: //g'
}

CPU_ID=`filter processor`
SOCKET_ID=(`filter 'physical id'`)
CORE_ID=(`filter 'core id'`)

for cpu_id in $CPU_ID; do
    echo "cpu $cpu_id: socket${SOCKET_ID[$cpu_id]}_core${CORE_ID[$cpu_id]}"
done

如果我在启用了HT的核心i7上运行此命令,则会得到以下输出:

代码语言:javascript
复制
cpu 0: socket0_core0
cpu 1: socket0_core1
cpu 2: socket0_core2
cpu 3: socket0_core3
cpu 4: socket0_core0
cpu 5: socket0_core1
cpu 6: socket0_core2
cpu 7: socket0_core3

在这里,您可以看到cpu 0和4在同一个内核上,即内核0上的HT线程。

将其与sched_setaffinity或pthread_setaffinity_np(3)结合使用将允许您将进程映射到一组CPU。您也可以不使用任何代码行来使用taskset(1)

票数 5
EN

Stack Overflow用户

发布于 2011-10-19 02:25:37

适用于Windows:GetLogicalProcessorInformationSetThreadAffinityMask

也有GetCurrentProcessorNumber(),但是当你没有将它们固定在特定的CPU上时,OSes会频繁地交换线程,所以它本身对你的目的没有什么帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-10-19 02:45:43

在linux上,看一下man pages for sched_setaffinity

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7811578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档