1

我正在开发一些具有可变线程数的 C++ 多核程序,我想知道如何设置适当的(实际上是“最好的”)亲和力。我使用 Boost-threads,所以我可以调用 get_hardware_concurrency() 来了解有多少逻辑内核。到现在为止,我写了一个映射“n_th thread to n-th logical core”,但这并不是最聪明的事情,因为多插槽处理器和超线程。我的程第 2 个物理上的第 1 个逻辑,...,第 n 个物理上的第 1 个逻辑,第 1 个物理上的第 2 个逻辑等等。

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

作为最简洁的我:我怎么知道操作系统(Windows和Linux)称为N-th的线程的确切位置(物理核心和包)?

4

4 回答 4

5

这是一个代码片段,它将为您提供 Linux 上的 CPU 拓扑。

#!/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 上运行它,我会得到以下输出:

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。您也可以使用没有代码行的任务集(1)

于 2011-10-18T20:37:31.050 回答
3

对于 Windows:GetLogicalProcessorInformationSetThreadAffinityMask

也有GetCurrentProcessorNumber(),但是当您不将它们固定到特定 CPU 时,操作系统经常交换线程,因此这对您自己的目的没有帮助。

于 2011-10-18T18:25:37.327 回答
1

在 linux 上,查看sched_setaffinity 的手册页

于 2011-10-18T18:45:42.743 回答
1

LIKWID 工具套件可以方便地处理多核环境中的拓扑和亲和性问题。除其他外,它还包含用于确定拓扑、将线程固定到内核以及测量硬件性能指标的工具:

http://code.google.com/p/likwid

只要代码中的线程机制是基于 pthreads 并且应用程序是动态链接的,likwid-pin 就可以在不更改源代码的情况下将线程绑定到资源。

于 2012-05-21T06:39:12.623 回答