【问题标题】:What core is a given thread running on?给定线程在哪个内核上运行?
【发布时间】:2011-04-28 13:48:27
【问题描述】:

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

【问题讨论】:

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

标签: c pthreads cpu openmp


【解决方案1】:

我认为在 Linux 上可以尝试 sched_getcpu()。

【讨论】:

    【解决方案2】:

    我认为这将是特定于平台的。在 Windows 上,您可以使用 NtGetCurrentProcessorNumber,但这需要注意,因为它可能会消失。

    我认为这很难做到,因为没有什么可以阻止线程随时移动到新内核(无论如何,在大多数应用程序中)。一旦你得到结果,它可能已经过时了。

    【讨论】:

      【解决方案3】:

      对于 pthreads,我认为@987654321@ 至少是解决方案的一部分。不过,不确定 pthreads 如何命名 CPU:s 和核心。

      【讨论】:

      • 谢谢。不过,亲和力可能会改变,对吧?或者一旦具有给定 pid 的线程被创建并且正在运行就不会改变亲和力?
      • @Dervin AFAIK on linux 如果你将你的线程绑定到一个核心,它不会改变。在 Windows 上,没有“绑定”到核心这样的东西。您可以向调度程序指示您想使用哪个内核,但不能保证调度程序会一直使用该内核。
      • 默认情况下没有亲和力,这不会告诉你任何事情。只有您已经设置了亲和力,它才会为您提供任何信息。
      【解决方案4】:

      这很难移植,因为答案取决于硬件和操作系统。

      hardware locality 库是一个新工具,可让您以与操作系统/硬件无关的方式查询 CPU/核心/线程等信息(并设置关联绑定)。它支持大量的硬件和操作系统,因此应该为这类查询增加很多可移植性。绘制系统拓扑后,hwloc_get_last_cpu_location 将返回上次运行线程的 CPU,其中 CPU 可以表示核心或硬件线程。

      【讨论】:

        猜你喜欢
        • 2013-02-27
        • 2014-02-02
        • 2011-12-23
        • 2017-08-22
        • 1970-01-01
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多