在Linux上使用pthread打印CPU和核心是否可行?

3
我在处理多线程应用程序在多个核心上的运行问题。我已经研究了亲和力、调度等方面。有没有一种方法可以找出任何线程正在运行的CPU Id?现在我正在使用sched_getaffinity,但我认为这与进程ID相关,而不是进程中的线程。多线程应用程序在Windows上运行得很好,但在Linux上似乎被CPU绑定(仅使用一个CPU)。
更新:
如果我的Linux应用程序启动了64个线程-我仍然只有一个pid,对吗?我还是理解每个启动的线程可以在目标硬件上的不同CPU / core上运行,对吗?
此处提供一个样例应用程序:如何使多线程应用程序在VMWare下的Ubuntu上使用所有核心?

可能是给定线程正在运行的核心是什么?的重复。 - Ben Voigt
1个回答

2

你的第一个问题

有没有办法找出正在运行的任何线程所在的CPU Id?我现在正在使用sched_getaffinity

sched_getaffinity不返回CPU,它返回一个合格CPU掩码。它说:

亲和力掩码实际上是可以调整每个线程组中每个线程独立地使用的线程属性。

然后

如果您正在使用POSIX线程API,则使用pthread_setaffinity_np(3)而不是sched_setaffinity()。

要简单查找使用的CPU,/proc/[pid]/stat有一个“processor”字段:

processor %d (since Linux 2.2.8) 上次执行的CPU编号。

你的第二个问题:

多线程应用程序在Windows上运行良好,但似乎在Linux上受到CPU限制(仅使用一个CPU)

请展示最小的可重现此问题的示例。


谢谢回复 - 我现在正在尝试使用pthread_setaffinity_np。有关示例应用,请参见我的问题:http://stackoverflow.com/questions/6488432/how-do-i-make-a-multi-threaded-app-use-all-the-cores-on-ubuntu-under-vmware - Jeff
/proc/[pid]/stat 中的信息是关于具有给定 PID 的进程的。要获取有关线程的相同统计信息,请参见 /proc/[pid]/task/[tid]/stat,其中 [tid] 是线程 ID。proc(5) man page 记录了这些 stat 文件中的字段。 - FooF

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