2011-04-28 20 views
3

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

+2

可能的重复[如何从用户空间应用程序(Linux,C)中获取CPU核心号?](http://stackoverflow.com/questions/491520/how-can-i-get- -pu-core-number-from-within-a-user-space-app-linux-c) – 2011-04-28 13:52:55

+0

OpenMP API不会为用户提供查找此信息的方法。您可以通过调用任何基于OpenMP的实现来获得它。但是,如前所述,除非OpenMP线程绑定到特定的处理器(在这种情况下,您不需要问),这确实没什么帮助。否则,操作系统可以随时更改OpenMP线程正在使用的处理器。你为什么想要这些信息? – ejd 2011-04-28 14:07:02

+0

为什么?这通常意味着你看错了线路...... – 2011-04-28 15:02:31

回答

1

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

+0

谢谢。亲和力可能会改变,对吧?或者一旦具有给定PID的线程被创建并且正在运行将不会改变亲和力? – 2011-04-28 13:54:20

+0

@Dervin在Linux上的AFAIK如果你将你的线程绑定到一个核心上,它不会改变。在windows上,没有像绑定到核心那样的东西。您可以向调度程序指出您要使用哪个核心,但不能保证调度程序将始终使用该核心。 – RedX 2011-04-28 14:09:02

+2

默认情况下没有亲和力,这不会告诉你任何东西。只有当你已经设置了亲和力,它才会给你任何信息。 – 2011-04-28 15:01:48

4

这将是平台特定的,我会想。在Windows上,您可以使用NtGetCurrentProcessorNumber,但这可能会消失。

我认为这很难做到,因为没有什么可以阻止线程在任何时候移动到新的核心(无论如何,在大多数应用程序中)。只要你得到结果,它可能会过时。

1

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

hardware locality库是一种新工具,它允许您以OS /硬件不可知的方式查询CPU /内核/线程等信息(并设置关联绑定)。它支持大量的硬件和操作系统,因此应该为这些查询增加许多可移植性。一旦映射出系统的拓扑结构,hwloc_get_last_cpu_location将返回线程最后一次运行的CPU,其中CPU可以表示核心或硬件线程。

3

我想在Linux上可以试试sched_getcpu()。

相关问题