给定线程运行在哪个核心上?

4

有没有一种函数或其他方法可以以编程方式知道我的程序(pid)的给定线程正在运行的处理器的哪个核心上?如果可能的话,OpenMP或Pthreads的解决方案都会对我有所帮助。谢谢。


OpenMP API没有提供用户查找此信息的方法。您可能可以通过调用基于OpenMP实现的内容来获取它。但是,正如已经提到的那样,除非OpenMP线程绑定到特定处理器(在这种情况下,您不需要询问),否则这真的没有太大帮助。否则,操作系统可以随时更改OpenMP线程正在使用的处理器。您为什么想要那个信息? - ejd
为什么?这通常意味着你以错误的方式看待线程... - R.. GitHub STOP HELPING ICE
4个回答

5
我认为在Linux上可以尝试使用sched_getcpu()函数。

4
这可能是与平台相关的。在Windows上,您可以使用NtGetCurrentProcessorNumber,但这可能会被标记为不稳定。我认为这很难做到,因为没有什么可以阻止线程随时移动到新的核心(在大多数应用程序中)。一旦获得结果,它就可能过时了。

1

对于pthreads,我认为sched_getaffinity()至少是部分解决方案。不过,我不确定pthread如何命名CPU和核心。


谢谢。亲和力可能会改变,对吗?或者一旦创建并运行具有给定pid的线程,就不会更改亲和力了吗? - Dervin Thunk
据我所知,在Linux上,如果您将线程绑定到一个核心,它就不会改变。在Windows上,没有“绑定”到核心的概念。您可以向调度程序指示要使用哪个核心,但不能保证调度程序始终使用该核心。 - RedX
2
默认情况下没有亲和性,这并不会告诉你任何信息。只有当你已经设置了亲和性,它才会给你任何信息。 - R.. GitHub STOP HELPING ICE

1

这在可移植性方面很难做到,因为答案取决于硬件和操作系统。

硬件地理 库是一个新工具,它允许您以一种与操作系统/硬件无关的方式查询CPU/核心/线程等信息(并设置亲和绑定)。它支持大量的硬件和操作系统,因此应该能够为这些查询添加很多可移植性。一旦映射出系统的拓扑结构,hwloc_get_last_cpu_location 将返回线程最后运行的 CPU,其中 CPU 可以是核心或者硬件线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接