Condividi tramite


Eseguire NAMD con Microsoft HPC Pack su nodi di calcolo su Linux in Azure

Importante

Le macchine virtuali classiche verranno ritirate il 1° marzo 2023.

Se si usano risorse IaaS da ASM, completare la migrazione entro il 1° marzo 2023. Ti invitiamo a effettuare il passaggio prima per sfruttare i numerosi miglioramenti delle funzionalità in Azure Resource Manager.

Per altre informazioni, vedere Eseguire la migrazione delle risorse IaaS ad Azure Resource Manager entro il 1° marzo 2023.

Questo articolo illustra un modo per eseguire un carico di lavoro HPC (High Performance Computing) Linux nelle macchine virtuali di Azure. In questo caso viene configurato un cluster microsoft HPC Pack in Azure con nodi di calcolo Linux ed è stata eseguita una simulazione NAMD per calcolare e visualizzare la struttura di un sistema biomolecolare di grandi dimensioni.

Nota

Azure include due diversi modelli di distribuzione per la creazione e l'uso delle risorse: Resource Manager eclassica. Questo articolo illustra l'uso di entrambi i modelli, ma Microsoft consiglia che la maggior parte delle nuove distribuzioni usi il modello di Resource Manager.

  • NAMD (per il programma Nanoscale Molecular Dynamics) è un pacchetto di dinamiche molecolari parallele progettato per la simulazione ad alte prestazioni di sistemi biomolecolare di grandi dimensioni contenenti fino a milioni di atomi. Esempi di questi sistemi includono virus, strutture cellulari e proteine di grandi dimensioni. NAMD si adatta a centinaia di core per le simulazioni tipiche e a più di 500.000 core per le simulazioni più grandi.
  • Microsoft HPC Pack offre funzionalità per eseguire applicazioni HPC e parallele su larga scala in cluster di computer locali o macchine virtuali di Azure. Originariamente sviluppato come soluzione per carichi di lavoro HPC Windows, HPC Pack supporta ora l'esecuzione di applicazioni HPC Linux in macchine virtuali del nodo di calcolo Linux distribuite in un cluster HPC Pack. Per un'introduzione, vedere Introduzione ai nodi di calcolo Linux in un cluster HPC Pack in Azure.

Prerequisiti

  • cluster HPC Pack con nodi di calcolo Linux : distribuire un cluster HPC Pack con nodi di calcolo Linux in Azure usando un modello di Azure Resource Manager o uno script di Azure PowerShell . Vedere Introduzione ai nodi di calcolo Linux in un cluster HPC Pack in Azure per i prerequisiti e i passaggi per entrambe le opzioni. Se si sceglie l'opzione di distribuzione script di PowerShell, vedere il file di configurazione di esempio nei file di esempio alla fine di questo articolo. Questo file configura un cluster HPC Pack basato su Azure costituito da un nodo head di Windows Server 2012 R2 e da quattro nodi di calcolo CentOS 6.6 di grandi dimensioni. Personalizzare questo file in base alle esigenze del proprio ambiente.
  • software NAMD e file di esercitazione - Scaricare il software NAMD per Linux dal sito NAMD (registrazione richiesta). Questo articolo si basa su NAMD versione 2.10 e utilizza l'archivio Linux-x86_64 (Intel/AMD a 64 bit con Ethernet). Scarica anche i file di esercitazione NAMD . I download sono .tar file ed è necessario uno strumento di Windows per estrarre i file nel nodo head del cluster. Per estrarre i file, seguire le istruzioni riportate più avanti in questo articolo.
  • VMD (facoltativo): per visualizzare i risultati del processo NAMD, scaricare e installare il programma di visualizzazione molecolare VMD in un computer preferito. La versione corrente è 1.9.2. Per iniziare, vedere il sito di download di VMD.

Configurare l'attendibilità reciproca tra i nodi di calcolo

L'esecuzione di un processo tra nodi in più nodi Linux richiede che i nodi si considerino attendibili tra loro (rsh o ssh). Quando si crea il cluster HPC Pack con lo script di distribuzione IaaS di Microsoft HPC Pack, lo script configura automaticamente l'attendibilità reciproca permanente per l'account amministratore specificato. Per gli utenti non amministratori che crei nel dominio del cluster, è necessario impostare una fiducia reciproca temporanea tra i nodi quando viene assegnata loro un'attività. Eliminare quindi la connessione dopo il completamento del lavoro. Per fare questo per ogni utente, fornire una coppia di chiavi RSA al cluster utilizzato da HPC Pack per stabilire la relazione di trust. Seguire le istruzioni.

Generare una coppia di chiavi RSA

È facile generare una coppia di chiavi RSA, che contiene una chiave pubblica e una chiave privata, eseguendo il comando linux ssh-keygen.

  1. Accedere a un computer Linux.

  2. Eseguire il comando seguente:

    ssh-keygen -t rsa
    

    Nota

    Premere INVIO per usare le impostazioni predefinite fino al completamento del comando. Non immettere una passphrase qui; quando viene richiesta una password, è sufficiente premere INVIO.

    Generare una coppia di chiavi RSA

  3. Passare alla directory ~/.ssh. La chiave privata viene archiviata in id_rsa e la chiave pubblica in id_rsa.pub.

    chiavi private e pubbliche

Aggiungere la coppia di chiavi al cluster HPC Pack

  1. Connettersi da Desktop remoto alla macchina virtuale del nodo head usando le credenziali di dominio specificate durante la distribuzione del cluster, ad esempio hpc\clusteradmin. Gestisci il cluster dal nodo principale.

  2. Usare le procedure standard di Windows Server per creare un account utente di dominio nel dominio di Active Directory del cluster. Ad esempio, usare lo strumento Utenti e computer di Active Directory nel nodo principale. Gli esempi in questo articolo presuppongono che si crei un utente di dominio denominato hpcuser nel dominio hpclab (hpclab\hpcuser).

  3. Aggiungere l'utente di dominio al cluster HPC Pack come utente del cluster. Per istruzioni, vedere Aggiungere o rimuovere utenti del cluster.

  4. Creare un file denominato C:\cred.xml e copiarvi i dati della chiave RSA. È possibile trovare un esempio nei file di esempio alla fine di questo articolo.

    <ExtendedData>
      <PrivateKey>Copy the contents of private key here</PrivateKey>
      <PublicKey>Copy the contents of public key here</PublicKey>
    </ExtendedData>
    
  5. Aprire un prompt dei comandi e immettere il comando seguente per impostare i dati delle credenziali per l'account hpclab\hpcuser. Si utilizza il parametro extendeddata per passare il nome del file che hai creato per i dati della chiave C:\cred.xml.

    hpccred setcreds /extendeddata:c:\cred.xml /user:hpclab\hpcuser /password:<UserPassword>
    

    Questo comando si completa correttamente senza output. Dopo aver impostato le credenziali per gli account utente necessari per eseguire i processi, archiviare il file cred.xml in un percorso sicuro o eliminarlo.

  6. Se è stata generata la coppia di chiavi RSA in uno dei nodi Linux, ricordarsi di eliminare le chiavi al termine dell'uso. HPC Pack non configura l'attendibilità reciproca se trova un file id_rsa esistente o un file id_rsa.pub.

Importante

Non è consigliabile eseguire un processo Linux come amministratore del cluster in un cluster condiviso, perché un processo inviato da un amministratore viene eseguito con l'account radice nei nodi Linux. Un processo inviato da un utente non amministratore viene eseguito con un account utente Linux locale con lo stesso nome dell'utente del processo. In questo caso, HPC Pack configura l'attendibilità reciproca per l'utente Linux in tutti i nodi allocati al processo. È possibile configurare manualmente l'utente Linux nei nodi Linux prima di eseguire il processo oppure HPC Pack crea automaticamente l'utente quando viene inviato il processo. Se HPC Pack crea l'utente, HPC Pack lo elimina al termine del processo. Per ridurre le minacce alla sicurezza, le chiavi vengono rimosse al termine del processo nei nodi.

Configurare una condivisione file per i nodi Linux

Configurare ora una condivisione file SMB e montare la cartella condivisa in tutti i nodi Linux per consentire ai nodi Linux di accedere ai file NAMD con un percorso comune. Di seguito sono riportati i passaggi per montare una cartella condivisa nel nodo head. Una condivisione è consigliata per le distribuzioni, ad esempio CentOS 6.6, che attualmente non supportano il servizio File di Azure. Se i nodi Linux supportano una condivisione file di Azure, vedere Come usare Archiviazione file di Azure con Linux. Per altre opzioni di condivisione file con HPC Pack, vedere Introduzione ai nodi di calcolo Linux in un cluster HPC Pack in Azure.

  1. Creare una cartella nel nodo head e condividerla con Tutti impostando privilegi di lettura/scrittura. In questo esempio\\CentOS66HN\Namd è il nome della cartella, dove CentOS66HN è il nome host del nodo head.

  2. Creare una sottocartella denominata namd2 nella cartella condivisa. In namd2 creare un'altra sottocartella denominata namdsample.

  3. Estrarre i file NAMD nella cartella usando una versione di Windows di tar o un'altra utilità di Windows che opera su .tar archivi.

    • Estrarre l'archivio TAR NAMD in \\CentOS66HN\Namd\namd2.
    • Estrai i file del tutorial sotto \\CentOS66HN\Namd\namd2\namdsample.
  4. Aprire una finestra di Windows PowerShell ed eseguire i comandi seguenti per montare la cartella condivisa nei nodi Linux.

    clusrun /nodegroup:LinuxNodes mkdir -p /namd2
    
    clusrun /nodegroup:LinuxNodes mount -t cifs //CentOS66HN/Namd/namd2 /namd2 -o vers=2.1`,username=<username>`,password='<password>'`,dir_mode=0777`,file_mode=0777
    

Il primo comando crea una cartella denominata /namd2 in tutti i nodi del gruppo LinuxNodes. Il secondo comando monta la cartella condivisa //CentOS66HN/Namd/namd2 nella cartella con dir_mode e file_mode bit impostati su 777. Il nome utente e la password nel comando devono essere le credenziali di un utente nel nodo head.

Nota

Il simbolo "'" nel secondo comando è un simbolo di escape per PowerShell. "'," indica che "," (carattere virgola) fa parte del comando.

Creare uno script Bash per eseguire un processo NAMD

Il tuo lavoro NAMD richiede un file nodelist affinché charmrun determini il numero di nodi da utilizzare per avviare i processi NAMD. Si usa uno script Bash che genera il file nodelist ed esegue charmrun con questo file nodelist. È quindi possibile inviare un processo NAMD in HPC Cluster Manager che chiama questo script.

Usando un editor di testo di propria scelta, creare uno script Bash nella cartella /namd2 contenente i file di programma NAMD e denominarlo hpccharmrun.sh. Per un modello di verifica rapido, copiare lo script di esempio hpccharmrun.sh fornito alla fine di questo articolo e passare a Inviare un processo NAMD.

Suggerimento

Salva il tuo script come file di testo utilizzando terminazioni di riga Linux (solo LF, non CR LF). In questo modo si garantisce che venga eseguito correttamente nei nodi Linux.

Di seguito sono riportati i dettagli sulle operazioni eseguite da questo script bash.

  1. Definire alcune variabili.

    #!/bin/bash
    
    # The path of this script
    SCRIPT_PATH="$( dirname "${BASH_SOURCE[0]}" )"
    # Charmrun command
    CHARMRUN=${SCRIPT_PATH}/charmrun
    # Argument of ++nodelist
    NODELIST_OPT="++nodelist"
    # Argument of ++p
    NUMPROCESS="+p"
    
  2. Ottenere informazioni sui nodi dalle variabili di ambiente. $NODESCORES archivia un elenco di parole suddivise da $CCP_NODES_CORES. $COUNT è la dimensione di $NODESCORES.

    # Get node information from the environment variables
    NODESCORES=(${CCP_NODES_CORES})
    COUNT=${#NODESCORES[@]}
    

    Il formato per la variabile $CCP_NODES_CORES è il seguente:

    <Number of nodes> <Name of node1> <Cores of node1> <Name of node2> <Cores of node2>…
    

    Questa variabile elenca il numero totale di nodi, nomi di nodo e numero di core in ogni nodo allocato al processo. Ad esempio, se per l'esecuzione del processo sono necessari 10 core, il valore di $CCP_NODES_CORES è simile al seguente:

    3 CENTOS66LN-00 4 CENTOS66LN-01 4 CENTOS66LN-03 2
    
  3. Se la variabile $CCP_NODES_CORES non è impostata, avviare charmrun direttamente. Questa operazione deve verificarsi solo quando si esegue questo script direttamente nei nodi Linux.

    if [ ${COUNT} -eq 0 ]
    then
      # CCP_NODES is_CORES is not found or is empty, so just run charmrun without nodelist arg.
      #echo ${CHARMRUN} $*
      ${CHARMRUN} $*
    
  4. In alternativa, creare un file nodelist per charmrun.

    else
      # Create the nodelist file
      NODELIST_PATH=${SCRIPT_PATH}/nodelist_$$
    
      # Write the head line
      echo "group main" > ${NODELIST_PATH}
    
      # Get every node name and number of cores and write into the nodelist file
      I=1
      while [ ${I} -lt ${COUNT} ]
      do
          echo "host ${NODESCORES[${I}]} ++cpus ${NODESCORES[$(($I+1))]}" >> ${NODELIST_PATH}
          let "I=${I}+2"
      done
    
  5. Eseguire charmrun con il file nodelist, ottenere lo stato restituito e rimuovere il file nodelist alla fine.

    ${CCP_NUMCPUS} è un'altra variabile di ambiente impostata dal nodo head HPC Pack. Archivia il numero di core totali allocati a questo processo. Viene usato per specificare il numero di processi per charmrun.

    # Run charmrun with nodelist arg
    #echo ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $*
    ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $*
    
    RTNSTS=$?
    rm -f ${NODELIST_PATH}
    fi
    
    
  6. Uscita con lo stato di ritorno charmrun.

    exit ${RTNSTS}
    

Di seguito sono riportate le informazioni nel file nodelist, generato dallo script:

group main
host <Name of node1> ++cpus <Cores of node1>
host <Name of node2> ++cpus <Cores of node2>
…

Per esempio:

group main
host CENTOS66LN-00 ++cpus 4
host CENTOS66LN-01 ++cpus 4
host CENTOS66LN-03 ++cpus 2

Inviare un job NAMD

Ora è possibile inviare un job NAMD in HPC Cluster Manager.

  1. Connettersi al nodo principale del cluster e avviare il Gestore del Cluster HPC.

  2. In Gestione risorseassicurarsi che i nodi di calcolo Linux siano nello stato online. Se non lo sono, selezionali e fai clic su Bring Online.

  3. In Gestione lavori, fare clic su Nuovo lavoro.

  4. Immettere un nome per l'attività, ad esempio hpccharmrun.

    Nuovo lavoro HPC

  5. Nella pagina Dettagli processo, sotto Risorse processo, selezionare il tipo di risorsa come Nodo e impostare il Minimo su 3. , viene eseguito il processo in tre nodi Linux e ogni nodo ha quattro core.

    Risorse di lavoro

  6. Fare clic su Modifica attività nella barra laterale sinistra e quindi fare clic su Aggiungi per aggiungere un'attività al lavoro.

  7. Nella pagina Dettagli attività e reindirizzamento I/O impostare i valori seguenti:

    • Riga di comando - /namd2/hpccharmrun.sh ++remote-shell ssh /namd2/namd2 /namd2/namdsample/1-2-sphere/ubq_ws_eq.conf > /namd2/namd2_hpccharmrun.log

      Suggerimento

      La riga di comando precedente è un singolo comando senza interruzioni di riga. Viene adattato per essere visualizzato su più righe sotto la riga di comando .

    • directory di lavoro - /namd2

    • minimo - 3

      dettagli attività

      Nota

      Imposta la directory di lavoro qui perché charmrun tenta di accedere alla stessa directory di lavoro su ogni nodo. Se la directory di lavoro non è impostata, HPC Pack avvia il comando in una cartella denominata in modo casuale creata in uno dei nodi Linux. In questo modo si verifica l'errore seguente negli altri nodi: /bin/bash: line 37: cd: /tmp/nodemanager_task_94_0.mFlQSN: No such file or directory. Per evitare questo problema, specificare un percorso di cartella accessibile da tutti i nodi come directory di lavoro.

  8. Fare clic su OK e quindi su Invia per eseguire questo processo.

    Per impostazione predefinita, HPC Pack invia l'attività utilizzando l'account utente attualmente connesso. Una finestra di dialogo potrebbe richiedere di immettere il nome utente e la password dopo aver fatto clic su Invia.

    credenziali di lavoro

    In alcune condizioni, HPC Pack memorizza le informazioni dell'utente immesse in precedenza e non visualizza questa finestra di dialogo. Per visualizzare di nuovo HPC Pack, inserire il seguente comando nel Prompt dei comandi e quindi inviare il processo.

    hpccred delcreds
    
  9. Il completamento del processo richiede alcuni minuti.

  10. Trova il log del processo in \\Namd\namd2\namd2_hpccharmrun.log e i file di output in \\Namd\namd2\namdsample\1-2-sphere.

  11. Se lo desideri, avvia VMD per visualizzare i risultati del lavoro. I passaggi per la visualizzazione dei file di output NAMD (in questo caso, una molecola di proteine ubiquitin in una sfera d'acqua) non rientrano nell'ambito di questo articolo. Per informazioni dettagliate, vedere namd tutorial.

    Risultati del lavoro

File di esempio

File di configurazione XML di esempio per la distribuzione del cluster tramite script di PowerShell

<?xml version="1.0" encoding="utf-8" ?>
<IaaSClusterConfig>
  <Subscription>
    <SubscriptionName>Subscription-1</SubscriptionName>
    <StorageAccount>mystorageaccount</StorageAccount>
  </Subscription>
      <Location>West US</Location>  
  <VNet>
    <VNetName>MyVNet</VNetName>
    <SubnetName>Subnet-1</SubnetName>
  </VNet>
  <Domain>
    <DCOption>HeadNodeAsDC</DCOption>
    <DomainFQDN>hpclab.local</DomainFQDN>
  </Domain>
  <Database>
    <DBOption>LocalDB</DBOption>
  </Database>
  <HeadNode>
    <VMName>CentOS66HN</VMName>
    <ServiceName>MyHPCService</ServiceName>
    <VMSize>Large</VMSize>
    <EnableRESTAPI />
    <EnableWebPortal />
  </HeadNode>
  <LinuxComputeNodes>
    <VMNamePattern>CentOS66LN-%00%</VMNamePattern>
    <ServiceName>MyLnxCNService</ServiceName>
     <VMSize>Large</VMSize>
     <NodeCount>4</NodeCount>
    <ImageName>5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150325</ImageName>
  </LinuxComputeNodes>
</IaaSClusterConfig>    

File di cred.xml di esempio

<ExtendedData>
  <PrivateKey>-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxJKBABhnOsE9eneGHvsjdoXKooHUxpTHI1JVunAJkVmFy8JC
qFt1pV98QCtKEHTC6kQ7tj1UT2N6nx1EY9BBHpZacnXmknpKdX4Nu0cNlSphLpru
lscKPR3XVzkTwEF00OMiNJVknq8qXJF1T3lYx3rW5EnItn6C3nQm3gQPXP0ckYCF
Jdtu/6SSgzV9kaapctLGPNp1Vjf9KeDQMrJXsQNHxnQcfiICp21NiUCiXosDqJrR
AfzePdl0XwsNngouy8t0fPlNSngZvsx+kPGh/AKakKIYS0cO9W3FmdYNW8Xehzkc
VzrtJhU8x21hXGfSC7V0ZeD7dMeTL3tQCVxCmwIDAQABAoIBAQCve8Jh3Wc6koxZ
qh43xicwhdwSGyliZisoozYZDC/ebDb/Ydq0BYIPMiDwADVMX5AqJuPPmwyLGtm6
9hu5p46aycrQ5+QA299g6DlF+PZtNbowKuvX+rRvPxagrTmupkCswjglDUEYUHPW
05wQaNoSqtzwS9Y85M/b24FfLeyxK0n8zjKFErJaHdhVxI6cxw7RdVlSmM9UHmah
wTkW8HkblbOArilAHi6SlRTNZG4gTGeDzPb7fYZo3hzJyLbcaNfJscUuqnAJ+6pT
iY6NNp1E8PQgjvHe21yv3DRoVRM4egqQvNZgUbYAMUgr30T1UoxnUXwk2vqJMfg2
Nzw0ESGRAoGBAPkfXjjGfc4HryqPkdx0kjXs0bXC3js2g4IXItK9YUFeZzf+476y
OTMQg/8DUbqd5rLv7PITIAqpGs39pkfnyohPjOe2zZzeoyaXurYIPV98hhH880uH
ZUhOxJYnlqHGxGT7p2PmmnAlmY4TSJrp12VnuiQVVVsXWOGPqHx4S4f9AoGBAMn/
vuea7hsCgwIE25MJJ55FYCJodLkioQy6aGP4NgB89Azzg527WsQ6H5xhgVMKHWyu
Q1snp+q8LyzD0i1veEvWb8EYifsMyTIPXOUTwZgzaTTCeJNHdc4gw1U22vd7OBYy
nZCU7Tn8Pe6eIMNztnVduiv+2QHuiNPgN7M73/x3AoGBAOL0IcmFgy0EsR8MBq0Z
ge4gnniBXCYDptEINNBaeVStJUnNKzwab6PGwwm6w2VI3thbXbi3lbRAlMve7fKK
B2ghWNPsJOtppKbPCek2Hnt0HUwb7qX7Zlj2cX/99uvRAjChVsDbYA0VJAxcIwQG
TxXx5pFi4g0HexCa6LrkeKMdAoGAcvRIACX7OwPC6nM5QgQDt95jRzGKu5EpdcTf
g4TNtplliblLPYhRrzokoyoaHteyxxak3ktDFCLj9eW6xoCZRQ9Tqd/9JhGwrfxw
MS19DtCzHoNNewM/135tqyD8m7pTwM4tPQqDtmwGErWKj7BaNZARUlhFxwOoemsv
R6DbZyECgYEAhjL2N3Pc+WW+8x2bbIBN3rJcMjBBIivB62AwgYZnA2D5wk5o0DKD
eesGSKS5l22ZMXJNShgzPKmv3HpH22CSVpO0sNZ6R+iG8a3oq4QkU61MT1CfGoMI
a8lxTKnZCsRXU1HexqZs+DSc+30tz50bNqLdido/l5B4EJnQP03ciO0=
-----END RSA PRIVATE KEY-----</PrivateKey>
  <PublicKey>ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEkoEAGGc6wT16d4Ye+yN2hcqigdTGlMcjUlW6cAmRWYXLwkKoW3WlX3xAK0oQdMLqRDu2PVRPY3qfHURj0EEellpydeaSekp1fg27Rw2VKmEumu6Wxwo9HddXORPAQXTQ4yI0lWSerypckXVPeVjHetbkSci2foLedCbeBA9c/RyRgIUl227/pJKDNX2Rpqly0sY82nVWN/0p4NAyslexA0fGdBx+IgKnbU2JQKJeiwOomtEB/N492XRfCw2eCi7Ly3R8+U1KeBm+zH6Q8aH8ApqQohhLRw71bcWZ1g1bxd6HORxXOu0mFTzHbWFcZ9ILtXRl4Pt0x5Mve1AJXEKb username@servername;</PublicKey>
</ExtendedData>

Script hpccharmrun.sh di esempio

#!/bin/bash

# The path of this script
SCRIPT_PATH="$( dirname "${BASH_SOURCE[0]}" )"
# Charmrun command
CHARMRUN=${SCRIPT_PATH}/charmrun
# Argument of ++nodelist
NODELIST_OPT="++nodelist"
# Argument of ++p
NUMPROCESS="+p"

# Get node information from ENVs
# CCP_NODES_CORES=3 CENTOS66LN-00 4 CENTOS66LN-01 4 CENTOS66LN-03 4
NODESCORES=(${CCP_NODES_CORES})
COUNT=${#NODESCORES[@]}

if [ ${COUNT} -eq 0 ]
then
    # If CCP_NODES_CORES is not found or is empty, just run the charmrun without nodelist arg.
    #echo ${CHARMRUN} $*
    ${CHARMRUN} $*
else
    # Create the nodelist file
    NODELIST_PATH=${SCRIPT_PATH}/nodelist_$$

    # Write the head line
    echo "group main" > ${NODELIST_PATH}

    # Get every node name & cores and write into the nodelist file
    I=1
    while [ ${I} -lt ${COUNT} ]
    do
        echo "host ${NODESCORES[${I}]} ++cpus ${NODESCORES[$(($I+1))]}" >> ${NODELIST_PATH}
        let "I=${I}+2"
    done

    # Run the charmrun with nodelist arg
    #echo ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $*
    ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $*

    RTNSTS=$?
    rm -f ${NODELIST_PATH}
fi

exit ${RTNSTS}