2013-08-28 120 views
2

從閱讀文檔,MPI_Bcast是一個阻塞調用(因此boost :: mpi :: broadcast)也是如此。衡量根節點廣播花費的時間量是衡量數據從根節點到所有其他節點所花費的時間的一個很好的衡量標準嗎?打開MPI廣播延遲測量

int64_t t1 = Utility::picosecondTime(); //exactly what it sounds like; utility that measures current time in picoseconds 
boost::mpi::broadcast(communicator, variable, 0); 
std::cout << "Broadcast took " << Utility::picosecondTime()-t1 << std::endl; 

還是直的openmpi:

MPI_Comm comm; 
int array[100]; 
... 
int64_t t1 = Utility::picosecondTime(); 
MPI_Bcast(array, 100, MPI_INT, 0, comm); 
std::cout << "Broadcast took " << Utility::picosecondTime()-t1 << std::endl; 

回答

2

MPI_BCAST,他們已經完成了他們的一部分後,通常是在某種樹的時尚,其中在樹的頂端過程可以退出算法來實現的廣播。因此,如果等級0將消息發送給等級1和等級n/2,那麼在這些消息完成後它可以離開。所以你的問題的答案是:不,這不是一個準確的測量。

如果沒有精確同步的時鐘,實際測量完整廣播跨越所有節點的時間很困難。有些技巧可以做得更近(在開始時間使用MPI_BARRIER進行同步,並使用廣播中的任何進程花費的最長時間),但由於時鐘仍傾向於有一些漂移,所以沒有什麼是完美的。

+0

謝謝,簡潔明白的答案。這個技巧也幫助我們找出了一個我們不知道的節點同步問題。 – jekelija

1

你錯了阻止全局同步調用。保證全局同步的唯一集體MPI操作是MPI_BARRIER - 除非所有進程都調用它,否則它不會完成。只要進行呼叫的流程不需要進一步參與,MPI就允許其他集體呼叫立即返回。

MPI_BCAST幾乎是後者的一個例子。 Open MPI提供了幾個實現,其中包括:基本線性,二叉樹,二叉樹和管道/鏈。每個實現可以進一步細分消息。在運行時使用硬編碼啓發式來根據消息大小和通信器的大小來選擇一個特定實現。從根級的角度來看,根據所使用的算法,相同的廣播操作可能花費不同的時間量。

  • 基本線性 - 這一個採用了一束MPI_ISEND秒,然後MPI_WAITALL,因此完成一次所有發送已經完成並且信息已經達到了所有其他等級;
  • 二進制/二叉樹 - 一旦消息已傳輸到根節點的直接後代的隊列,則完成一次;它仍然需要更多時間才能到達樹中的所有節點;
  • 流水線 - 這個分割消息並實現一個流水線,它將根段之後的段從下一層傳遞到下一層,然後將它們交給下一層等,在大量消息和非常快的網絡(例如InfiniBand)中完成根中的操作意味着全球完成即將到來;
  • 鏈 - 它將進程劃分爲幾個組,然後爲每個組實現單獨的管道。

可以實施一定的算法由開放MPI使用 - 只要看看在coll_tuned_bcast_algorithm MCA參數的可能值和其它相關參數:

$ ompi_info --mca coll_tuned_use_dynamic_rules 1 --param coll tuned | grep bcast 

正確的方法來衡量MPI_BCAST的時間應該是用MPI_BARRIER調用包圍它,但是您還必須正確測量屏障呼叫本身的開銷,然後對其進行補償。