2015-01-29 15 views
6

Guardando il seguente estratto dal openmpi manualSintassi del --map-by opzione openmpi mpirun v1.8

--map-by <foo> 
    Map to the specified object, defaults to socket. Supported options 
    include slot, hwthread, core, L1cache, L2cache, L3cache, socket, 
    numa, board, node, sequential, distance, and ppr. Any object can 
    include modifiers by adding a : and any combination of PE=n (bind n 
    processing elements to each proc), SPAN (load balance the processes 
    across the allocation), OVERSUBSCRIBE (allow more processes on a node 
    than processing elements), and NOOVERSUBSCRIBE. This includes PPR, 
    where the pattern would be terminated by another colon to separate 
    it from the modifiers. 

ho domande diverse per quanto riguarda la sintassi e alcuni commenti su di loro:

  • a cosa si riferiscono le opzioni sequential, distance e ppr?

Soprattutto ppr mi indovina. Cosa sta abbreviando?

  • come devo capire opzioni come --map-by ppr:4:socket riguardo l'estratto del manuale?

Naturalmente posso vedere il risultato della prima opzione, cercando in binding segnalati con --report-bindings (solo 4 processi sono mappati su uno zoccolo e di default vincolato a 4 core di una presa), ma non può fare tutto senso della sintassi. In un'altra linea del manuale c'è scritto che questa nuova opzione sostituisce l'uso di deprecato --npersocket:

-npersocket, --npersocket <#persocket> 
    On each node, launch this many processes times the number of processor 
    sockets on the node. The -npersocket option also turns on the -bind- 
    to-socket option. (deprecated in favor of --map-by ppr:n:socket) 

risposta

11

ppr significa processi per risorsa. La sua sintassi è ppr:N:resource e significa "assegnare i processi N a ciascuna risorsa di tipo risorsa disponibile sull'host". Ad esempio, in un sistema a 4 socket con CPU 6 core aventi --map-by ppr:4:socket risultati nel seguente mappa del processo:

socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- 
core  0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 
process A B C D  E F G H  I J K L  M N O P 

(numerazione processo va da A a Z in questo esempio)

Nei i mezzi manuali è che l'intero ppr:N:resource deve essere considerato come un singolo specificatore e che le opzioni potrebbero essere aggiunte dopo di esso, separate da :, ad esempio ppr:2:socket:pe=2. Questo va letta come "iniziare due processi per ogni presa di corrente e si legano ciascuno di loro di due elementi di elaborazione" e dovrebbe comportare la seguente mappa dato lo stesso sistema quad-socket:

socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- 
core  0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 
process A A B B  C C D D  E E F F  G G H H 

Il sequential mapper legge il file host linea per linea e avvia un processo per host trovato lì. Ignora il numero di slot, se indicato.

Il programma di mappatura dist elabora i nodi NUMA in base alla distanza di quest'ultimo da una determinata risorsa PCI. Ha senso solo sui sistemi NUMA. Nuovamente, usiamo il sistema quad-socket giocattolo, ma questa volta estendere la rappresentazione in modo da mostrare la topologia NUMA:

Socket 0 ------------- Socket 1 
    |      | 
    |      | 
    |      | 
    |      | 
    |      | 
Socket 2 ------------- Socket 3 
    | 
    ib0 

I confini tra le prese rappresentano collegamenti CPU. Questi sono, ad es. Collegamenti QPI per CPU Intel e collegamenti HT per CPU AMD. ib0 è un HCA InfiniBand utilizzato per comunicare con altri nodi di calcolo. Ora, in quel sistema, Socket 2 parla direttamente con InfiniBand HCA. Socket 0 e Socket 3 devono attraversare un collegamento CPU per parlare con ib0 e Socket 1 deve attraversare 2 collegamenti CPU.Ciò significa che i processi in esecuzione su Socket 2 avranno la latenza più bassa possibile durante l'invio e la ricezione di messaggi e processi sul socket 1 avranno la massima latenza possibile.

Come funziona? Ad esempio, se il tuo file host lo specifica 16 slot su tale host e la funzione di mappatura è --map-by dist:ib0, può comportare la seguente mappa:

socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- 
core  0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 
process G H I J K L     A B C D E F M N O P 

6 processi sono mappati alla presa 2 che è più vicino al HCA InfiniBand, poi altri 6 sono mappati alla presa 0 questo è il secondo più vicino e altri 4 sono mappati su Socket 3. È anche possibile distribuire i processi anziché riempire linearmente gli elementi di elaborazione. --map-by dist:ib0:span risultati in:

socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- 
core  0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 
process E F G H  M N O P  A B C D  I J K L 

La topologia NUMA reale si ottiene utilizzando la libreria hwloc, che legge le informazioni sulla distanza fornite dal BIOS. hwloc include uno strumento da riga di comando denominato hwloc-ls (noto anche come lstopo) che potrebbe essere utilizzato per visualizzare la topologia del sistema. Normalmente include solo la topologia degli elementi di elaborazione e i domini NUMA nel suo output, ma se gli dai l'opzione -v include anche i dispositivi PCI.

+0

Davvero utile, ty. –