2015-11-29 110 views
0

我想實現一個MPI程序,它有一個服務器節點將任務分配給客戶端節點,但我是新生,不知道如何管理客戶名單,任何人都可以幫助我嗎?如何在MPI客戶端/服務器模式下管理客戶端列表

讓我形容它更註明:

服務器節點:

MPI_COMM clients[4]; // store client communicators, but I am not sure this is correct or not! 

多個客戶端連接到使用mpirun -np 1 ./mpiclient一次以上的服務器,處理器不大於1

我之所以想要做到這一點是我想發送每個客戶不同的工作來計算。

問題2:如何獲取客戶端的屬性?

例如:MPI_Comm_accept(portname,MPI_INFO_NULL,0,MPI_COMM_SELF,&client); 如何獲取客戶端名稱或IP?

+0

MPI作業本質上是分佈式的。將客戶端連接到服務器是一種集體操作,即它涉及客戶端作業的所有等級,因此即使客戶端是單身人士,也不存在與作業相關聯的單個主機名或IP。我不知道MPI中有任何便攜式機制可以獲得這種識別。你應該把對講機當作客戶的ID。 –

+0

您確定您確實需要/需要使用'MPI_Comm_connect' /'MPI_Comm_accept'嗎?在大多數情況下,使用MPI的人在作業開始時啓動所有進程mpirun -np 5。/ mpiapp,並指定某些等級來執行某些操作。當你*可以*用MPI進行MPMD時,它不是我開始的地方。 –

回答

1

我不知道這裏有一個最佳實踐,但有幾個選項。

  1. 提前知道您的IP地址列表。

大多數情況下,人們使用靜態IP地址池設置羣集。這意味着它很容易預測誰將連接,因此您可以爲每個IP地址撥打MPI_COMM_ACCEPT,並且客戶端已經知道「服務器」的地址。

  • 不要使用連接/接受直接
  • 它可能沒有必要去通過直接管理所有連接的設備的疼痛。你也許可以做其他的事情,比如MPI_COMM_SPAWN(_MULTIPLE),並直接從你的主人產生你的孩子。這簡化了管理連接,但您仍然需要處理MPI中動態處理的一些奇怪問題,特別是跨通信器。

  • 在所有
  • 很多時候不要使用動態過程,人們進入分佈式編程,特別MPI,首次仍然有插座參照系。意思是,他們期望不得不建立他們自己的連接和通信管理。實際上,MPI和其他通信庫的設計略高於此,讓您忽略一些平凡的通信管理,並直接傳遞數據。通常在MPI工作中,您將爲您的程序使用一個二進制文件,並讓每個進程根據其等級決定他們將要執行的操作。例如:

    mpirun -np 5 ./my_prog 
    
    ... 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    
    if (rank == 0) { 
        /* Distribute work */ 
    } else { 
        /* Get work from rank 0 */ 
    } 
    ... 
    

    如果您想爲程序的不同部分分隔出代碼,也可以這種方式運行多個二進制文件。你怎麼跑這可以實現而異,但與MPICH,它的工作原理是這樣的:

    mpiexec -n 1 ./my_prog1 : -n 4 ./my_prog2 
    

    然後my_prog1將工作分配給所有正在運行的my_prog2的其他進程。在這個模型中,所有的過程仍然以相同的MPI_COMM_WORLD結束,所以他們可以在程序開始時檢查他們的等級並開始工作。

    +0

    謝謝韋斯利。但我如何管理客戶端?我嘗試在服務器方面使用&rank來區分它是哪個客戶端,但rank並不是指客戶端。我嘗試使用worldSize(來自MPI_Comm_size)來獲取總共有多少客戶端,但總是得到1(我想這是指服務器處理器) – EricLin

    +0

    MPI沒有關於在哪個機器上運行等級的概念。當你進入應用程序時,它應該是硬件不可知的。 –