Domanda

Se ho bisogno di eseguire molti programmi seriali "in parallelo" (perché il problema è semplice ma richiede tempo: devo leggere molti set di dati diversi per lo stesso programma), la soluzione è semplice se utilizzo solo un nodo.Tutto quello che faccio è continuare a inviare lavori seriali con una e commerciale dopo ogni comando, ad es.nello script del lavoro:

./program1 &
./program2 &
./program3 &
./program4

che eseguirà naturalmente ciascun programma seriale su un processore diverso.Funziona bene su un server di accesso o su una workstation autonoma e, naturalmente, per un lavoro batch che richiede un solo nodo.

Ma cosa succede se devo eseguire 110 istanze diverse dello stesso programma per leggere 110 set di dati diversi?Se invio a più nodi (diciamo 14) con uno script che invia 110 comandi ./program#, il sistema batch eseguirà ciascun lavoro su un processore diverso sui diversi nodi o tenterà di eseguirli tutti sullo stesso, 8 nodi principali?

Ho provato a utilizzare un semplice codice MPI per leggere dati diversi, ma risultano vari errori, con circa 100 processi su 110 riusciti e gli altri che si bloccano.Ho anche considerato gli array di lavori, ma non sono sicuro che il mio sistema lo supporti.

Ho testato ampiamente il programma seriale su singoli set di dati: non ci sono errori di runtime e non supero la memoria disponibile su ciascun nodo.

È stato utile?

Soluzione

No, PBS non distribuirà automaticamente i lavori tra i nodi per te.Ma questa è una cosa comune da voler fare e hai alcune opzioni.

  • La soluzione più semplice e in un certo senso più vantaggiosa per te è raggruppare le attività in blocchi delle dimensioni di 1 nodo e inviare tali pacchetti come lavori individuali.In questo modo i tuoi lavori inizieranno più velocemente;un lavoro a 1 nodo verrà normalmente pianificato più velocemente di un lavoro (ad esempio) a 14 nodi, solo perché nella pianificazione sono presenti più buchi delle dimensioni di un nodo rispetto a 14.Ciò funziona particolarmente bene se tutti i lavori richiedono più o meno la stessa quantità di tempo, perché in questo caso eseguire la divisione è piuttosto semplice.

  • Se vuoi fare tutto in un unico lavoro (ad esempio, per semplificare la contabilità), potresti avere o meno accesso al comando pbsdsh;c'è una bella discussione a riguardo Qui.Ciò ti consente di eseguire un singolo script su tutti i processori nel tuo lavoro.Quindi scrivi uno script che interroga $PBS_VNODENUM per scoprire quale dei lavori nnodes*ppn è ed esegue l'attività appropriata.

  • Se non pbsdsh, Gnu parallelo è un altro strumento che può semplificare enormemente questi compiti.È come xargs, se lo conosci, ma eseguirà i comandi in parallelo, anche su più nodi.Quindi invierai il tuo (diciamo) lavoro a 14 nodi e faresti eseguire al primo nodo uno script parallelo gnu.La cosa bella è che questo ti consentirà di pianificare anche se i lavori non hanno tutti la stessa durata.Il consiglio che diamo agli utenti del nostro sistema per l'utilizzo di Gnu Parallel per questo genere di cose è Qui.Tieni presente che se gnu parallel non è installato sul tuo sistema e per qualche motivo i tuoi amministratori di sistema non lo faranno, puoi configurarlo nella tua directory home, non è una build complicata.

Altri suggerimenti

Dovresti considerare array di lavoro.

In breve, inserisci #PBS -t 0-109 Nello script di shell (dove l'intervallo 0-109 Può essere qualsiasi gamma intera che desideri, ma hai dichiarato di avere 110 set di dati) e la coppia lo farà:

  • Esegui 110 istanze del tuo script, allocando a testa con le risorse che specificate (nello script con #PBS tag o come argomenti quando invii).
  • Assegna un numero intero unico da 0 a 109 alla variabile di ambiente PBS_ARRAYID per ogni lavoro.

Supponendo che tu abbia accesso alle variabili di ambiente all'interno del codice, puoi semplicemente dire a ogni lavoro di eseguire sul numero del set di dati PBS_ARRAYID.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top