2011-04-28 19 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()。

相關問題