2013-02-04 68 views
0

我目前正在開發一個項目,我需要知道當前在MPI上運行該進程的處理器的coreid? MPI中有一個名爲的函數MPI_Get_processor_name(char * name,int * resultlen)。這隻給出了進程正在運行的節點的名稱。我想知道它正在運行的核心的ID?可能嗎?如果是這樣,任何人都可以給我這個代碼片段嗎?如何知道在MPI上運行哪個核心進程?

謝謝

+2

閱讀我的回答類似的問題 - http://stackoverflow.com/questions/14569577/mpi-process-ids/14572391#14572391 - 並改變其需要改變,以它的那些部分回答你的問題。 –

+0

感謝您的回覆。我正在詢問coreid(系統的哪個核心(在一個內部節點環境中))進程正在運行。我不是爲了process_id(pid)。爲此,我可以使用Linux系統調用getpid()。 –

回答

2

這裏給出了它們綁定的每個進程的coreids的代碼。這需要Hristo Iliev在前面的回答評論中提出的hlloc庫。

#include <stdio.h> 
    #include "mpi.h" 
    #include <hwloc.h> 

    int main(int argc, char* argv[]) 
    { 
     int rank, size; 
     cpu_set_t mask; 
     long num; 
     int proc_num(long num); 

     hwloc_topology_t topology; 
     hwloc_cpuset_t cpuset; 
     hwloc_obj_t obj; 


     MPI_Init(&argc, &argv); 
     MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
     MPI_Comm_size(MPI_COMM_WORLD, &size); 

     hwloc_topology_init (&topology); 
     hwloc_topology_load (topology); 

     hwloc_bitmap_t set = hwloc_bitmap_alloc(); 
     hwloc_obj_t pu; 
     int err; 

     err = hwloc_get_proc_cpubind(topology, getpid(), set, HWLOC_CPUBIND_PROCESS); 
     if (err) { 
     printf ("Error Cannot find\n"), exit(1); 
     } 

     pu = hwloc_get_pu_obj_by_os_index(topology, hwloc_bitmap_first(set)); 
     printf ("Hello World, I am %d and pid: %d coreid:%d\n",rank,getpid(),hwloc_bitmap_first(set)); 

     int my_coreid = hwloc_bitmap_first(set); 
     int all_coreid[size]; 
     hwloc_bitmap_free(set); 
     hwloc_topology_destroy(topology); 
     MPI_Finalize(); 
     return 0; 

} 
+0

行「cpu_set_t mask」給我的hwloc版本提供了一個編譯器錯誤,但幸運的是這個變量仍然沒有被使用。 –

1

你的問題假定每個MPI進程運行綁定到單個CPU核心。這不是許多集羣MPI實施的默認行爲。例如,Open MPI具有必要的綁定機制,但必須使用--bind-to-core--bind-to-socket選項明確啓用它。另一方面,現代英特爾MPI版本由於性能原因默認啓用綁定。由於這種差異,大多數集羣MPI實現MPI_GET_PROCESSOR_NAME只是簡單地返回執行節點的主機名,因爲在一般情況下沒有可識別的特定處理器。

當每個進程運行綁定到一個核心時,綁定通常可以通過讀取進程的親和性掩碼來獲得。這取決於操作系統,但有些庫可以將其抽象出來,例如hwloc library(Open MPI的一部分,但作爲完全獨立的項目開發,因此可以自行使用)。在一般情況下讀取親和性掩碼也是可能的 - 當一個進程未被綁定時,親和性掩碼將簡單地匹配系統親緣性掩碼(即在所有處理器上允許執行)。

有些平臺的綁定是系統硬件工作的一部分,例如, IBM Blue Gene。在每個調用過程中,每個MPI過程都在唯一可識別的處理器上執行,並且MPI_Get_processor_name返回唯一的字符串值。

+0

@ Hristo Iliev。非常感謝你的回覆。不幸的是,我沒有足夠的聲望去投票。你用過hwloc庫嗎?如果是這樣,你可以請告訴我如何去獲得運行的進程的核心。其實我又找到了一個sched_getcpu()。這是否會給出正確的結果?我試圖通過使用taskset命令來驗證它。結果並不如預期。 –

+0

'sched_getcpu()'是非常''glibc'特定的,它返回線程當前正在執行的CPU。如果線程沒有綁定到特定的內核,那麼來自連續調用的返回值可能會因線程可能被遷移到其他內核而不同。 'sched_getaffinity()'是返回活動關聯掩碼的調用。 –

+0

如何從作爲參數傳遞給sched_getaffinity()函數的掩碼中提取出coreid? –

相關問題