Partilhar via


Executar o NAMD com o Microsoft HPC Pack em nós de computação do Linux no Azure

Importante

As VMs clássicas serão desativadas em 1 de março de 2023.

Se você usa recursos IaaS do ASM, conclua sua migração até 1º de março de 2023. Recomendamos que você faça a mudança mais cedo para aproveitar os muitos aprimoramentos de recursos no Gerenciador de Recursos do Azure.

Para obter mais informações, consulte Migrar os seus recursos IaaS para o Azure Resource Manager até 1º de março de 2023.

Este artigo mostra uma maneira de executar uma carga de trabalho de computação de alto desempenho (HPC) do Linux em máquinas virtuais do Azure. Aqui, você configura um cluster Microsoft HPC Pack no Azure com nós de computação Linux e executa uma simulação de NAMD para calcular e visualizar a estrutura de um grande sistema biomolecular.

Observação

O Azure tem dois modelos de implantação diferentes para criar e trabalhar com recursos: o Resource Manager e o clássico. Este artigo aborda o uso de ambos os modelos, mas a Microsoft recomenda que a maioria das novas implantações use o modelo do Resource Manager.

  • NAMD (para o programa de Dinâmica Molecular em Nanoescala) é um pacote paralelo de dinâmica molecular projetado para simulação de alto desempenho de grandes sistemas biomoleculares contendo até milhões de átomos. Exemplos desses sistemas incluem vírus, estruturas celulares e grandes proteínas. O NAMD é dimensionado para centenas de núcleos para simulações típicas e para mais de 500.000 núcleos para as maiores simulações.
  • Microsoft HPC Pack fornece recursos para executar HPC em grande escala e aplicativos paralelos em clusters de computadores locais ou máquinas virtuais do Azure. Originalmente desenvolvido como uma solução para cargas de trabalho HPC do Windows, o HPC Pack agora suporta a execução de aplicativos HPC Linux em VMs de nó de computação Linux implantadas em um cluster HPC Pack. Consulte Introdução aos nós de computação do Linux em um cluster HPC Pack no Azure para obter uma introdução.

Pré-requisitos

  • cluster HPC Pack com nós de computação Linux - Implante um cluster HPC Pack com nós de computação Linux no Azure usando um modelo do Azure Resource Manager ou um script do Azure PowerShell. Consulte Introdução aos nós de computação do Linux em um cluster HPC Pack no Azure para obter os pré-requisitos e as etapas para qualquer uma das opções. Se você escolher a opção de implantação de script do PowerShell, consulte o arquivo de configuração de exemplo nos arquivos de exemplo no final deste artigo. Este ficheiro configura um cluster HPC Pack baseado no Azure que consiste num nó principal Windows Server 2012 R2 e quatro nós de computação de tamanho Large CentOS 6.6. Personalize esse arquivo conforme necessário para seu ambiente.
  • software NAMD e arquivos tutoriais - Faça o download do software NAMD para Linux a partir do site NAMD (registro necessário). Este artigo é baseado na versão 2.10 do NAMD e utiliza o arquivo Linux-x86_64 (Intel/AMD de 64 bits com Ethernet). Também descarregue os arquivos do tutorial NAMD . Os downloads são arquivos .tar e você precisa de uma ferramenta do Windows para extrair os arquivos no nó principal do cluster. Para extrair os ficheiros, siga as instruções mais adiante neste artigo.
  • VMD (opcional) - Para ver os resultados do seu trabalho NAMD, baixe e instale o programa de visualização molecular VMD em um computador de sua escolha. A versão atual é 1.9.2. Consulte o site de download do VMD para começar.

Estabelecer confiança mútua entre os nós de computação

A execução de um trabalho entre nós em vários nós Linux requer que os nós confiem uns nos outros (rsh ou ssh). Quando você cria o cluster HPC Pack com o script de implantação IaaS do Microsoft HPC Pack, o script configura automaticamente a confiança mútua permanente para a conta de administrador especificada. Para usuários não administradores criados no domínio do cluster, é necessário configurar a confiança mútua temporária entre os nós quando um trabalho é alocado a eles. Em seguida, destrua o relacionamento depois que o trabalho for concluído. Para fazer isso para cada usuário, forneça um par de chaves RSA para o cluster que o HPC Pack usa para estabelecer a relação de confiança. Seguem-se as instruções.

Gerar um par de chaves RSA

É fácil gerar um par de chaves RSA, que contém uma chave pública e uma chave privada, executando o comando Linux ssh-keygen.

  1. Faça logon em um computador Linux.

  2. Execute o seguinte comando:

    ssh-keygen -t rsa
    

    Observação

    Pressione Enter para usar as configurações padrão até que o comando seja concluído. Não insira uma frase secreta aqui; quando for solicitada uma senha, basta pressionar Enter.

    Gerar um par de chaves RSA

  3. Altere o diretório para o diretório ~/.ssh. A chave privada é armazenada no id_rsa e a chave pública no id_rsa.pub.

    Chaves públicas e privadas

Adicionar o par de chaves ao cluster HPC Pack

  1. Conectar através da Área de Trabalho Remota à máquina virtual do nó principal usando as credenciais de domínio fornecidas aquando da implementação do cluster (por exemplo, hpc\clusteradmin). Você gerencia o cluster a partir do nó principal.

  2. Use procedimentos padrão do Windows Server para criar uma conta de usuário de domínio no domínio do Ative Directory do cluster. Por exemplo, use a ferramenta Usuário e Computadores do Ative Directory no nó principal. Os exemplos neste artigo pressupõem que você crie um usuário de domínio chamado hpcuser no domínio hpclab (hpclab\hpcuser).

  3. Adicione o usuário do domínio ao cluster do HPC Pack como um usuário do cluster. Para obter instruções, consulte Adicionar ou remover usuários de cluster.

  4. Crie um arquivo chamado C:\cred.xml e copie os dados da chave RSA para ele. Você pode encontrar um exemplo nos arquivos de exemplo no final deste artigo.

    <ExtendedData>
      <PrivateKey>Copy the contents of private key here</PrivateKey>
      <PublicKey>Copy the contents of public key here</PublicKey>
    </ExtendedData>
    
  5. Abra um prompt de comando e digite o seguinte comando para definir os dados de credenciais para a conta hpclab\hpcuser. Use o parâmetro extendeddata para passar o nome do ficheiro C:\cred.xml que criou para os dados-chave.

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

    Este comando conclui-se com êxito sem gerar saída. Depois de definir as credenciais para as contas de usuário, você precisa executar trabalhos, armazenar o arquivo cred.xml em um local seguro ou excluí-lo.

  6. Se você gerou o par de chaves RSA em um dos seus nós Linux, lembre-se de excluir as chaves depois de terminar de usá-las. O HPC Pack não configura a confiança mútua se encontrar um ficheiro id_rsa existente ou um ficheiro id_rsa.pub.

Importante

Não recomendamos a execução de um trabalho Linux como administrador de cluster em um cluster compartilhado, porque um trabalho enviado por um administrador é executado sob a conta raiz nos nós Linux. Um trabalho enviado por um usuário não administrador é executado sob uma conta de usuário Linux local com o mesmo nome do usuário do trabalho. Nesse caso, o HPC Pack configura a confiança mútua para esse usuário Linux em todos os nós alocados para o trabalho. Você pode configurar o usuário Linux manualmente nos nós Linux antes de executar o trabalho, ou o HPC Pack cria o usuário automaticamente quando o trabalho é enviado. Se o HPC Pack criar o utilizador, o HPC Pack elimina-o após a conclusão do trabalho. Para reduzir a ameaça de segurança, as chaves são removidas após a conclusão do trabalho nos servidores.

Configurar uma partilha de ficheiros para sistemas Linux

Agora configure um compartilhamento de arquivos SMB e monte a pasta compartilhada em todos os nós Linux para permitir que os nós Linux acessem arquivos NAMD com um caminho comum. A seguir estão as etapas para montar uma pasta partilhada no nó principal. Um compartilhamento é recomendado para distribuições como o CentOS 6.6 que atualmente não oferecem suporte ao serviço de Arquivo do Azure. Se os seus nós Linux suportarem uma partilha de ficheiros do Azure, consulte Como utilizar o armazenamento de ficheiros do Azure com o Linux. Para obter opções adicionais de compartilhamento de arquivos com o HPC Pack, consulte Introdução aos nós de computação do Linux em um cluster de pacote HPC no Azure.

  1. Crie uma pasta no nó principal e partilhe-a com todos, ao definir os privilégios de leitura e gravação. Neste exemplo, \\CentOS66HN\Namd é o nome da pasta, sendo CentOS66HN o nome do host do nó principal.

  2. Crie uma subpasta chamada namd2 na pasta compartilhada. Em namd2, crie uma subpasta adicional chamada namdsample.

  3. Extraia os arquivos NAMD na pasta usando uma versão do Windows do tar ou outro utilitário do Windows que opere em .tar arquivos.

    • Extraia o arquivo tar NAMD para \\CentOS66HN\Namd\namd2.
    • Extraia os arquivos do tutorial em \\CentOS66HN\Namd\namd2\namdsample.
  4. Abra uma janela do Windows PowerShell e execute os seguintes comandos para montar a pasta compartilhada nos nós do 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
    

O primeiro comando cria uma pasta chamada /namd2 em todos os nós do grupo LinuxNodes. O segundo comando monta a pasta partilhada //CentOS66HN/Namd/namd2 na pasta com os bits dir_mode e file_mode ajustados para 777. No comando, o nome de utilizador e a senha devem corresponder às credenciais de um utilizador no nó principal.

Observação

O símbolo "'" no segundo comando é um símbolo de escape para o PowerShell. "'," significa que o "," (caractere vírgula) é uma parte do comando.

Criar um script Bash para executar um trabalho NAMD

O seu trabalho NAMD precisa de um ficheiro de lista de nós para o charmrun determinar o número de nós a serem usados ao iniciar os processos do NAMD. Você usa um script Bash que gera o arquivo nodelist e executa charmrun com esse arquivo nodelist. Em seguida, pode submeter um trabalho NAMD no HPC Cluster Manager que chame este script.

Usando um editor de texto de sua escolha, crie um script Bash na pasta /namd2 contendo os arquivos de programa NAMD e nomeie-o hpccharmrun.sh. Para uma rápida prova de conceito, copie o exemplo de script hpccharmrun.sh fornecido no final deste artigo e vá para Enviar um trabalho NAMD.

Sugestão

Salve seu script como um arquivo de texto com terminações de linha Linux (somente LF, não CR LF). Isso garante que ele seja executado corretamente nos nós do Linux.

A seguir estão detalhes sobre o que esse script bash faz.

  1. Defina algumas variáveis.

    #!/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. Obtenha informações do nó a partir das variáveis de ambiente. $NODESCORES armazena uma lista de palavras divididas de $CCP_NODES_CORES. $COUNT é o tamanho de $NODESCORES.

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

    O formato da variável $CCP_NODES_CORES é o seguinte:

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

    Essa variável lista o número total de nós, os nomes dos nós e o número de núcleos em cada nó que estão alocados à tarefa. Por exemplo, se o trabalho precisar de 10 núcleos para ser executado, o valor de $CCP_NODES_CORES será semelhante a:

    3 CENTOS66LN-00 4 CENTOS66LN-01 4 CENTOS66LN-03 2
    
  3. Se a variável $CCP_NODES_CORES não estiver definida, inicie charmrun diretamente. (Isso só deve ocorrer quando você executa esse script diretamente em seus nós 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. Ou crie um arquivo nodelist para 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. Execute charmrun com o arquivo nodelist, obtenha seu status de retorno e remova o arquivo nodelist no final.

    ${CCP_NUMCPUS} é outra variável de ambiente definida pelo nó principal do HPC Pack. Ele armazena o número total de núcleos alocados para esse trabalho. Nós o usamos para especificar o número de processos para 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. Saia com o status de retorno charmrun.

    exit ${RTNSTS}
    

A seguir estão as informações no arquivo nodelist, que o script gera:

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

Por exemplo:

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

Submeter uma tarefa NAMD

Agora você está pronto para enviar um trabalho NAMD no HPC Cluster Manager.

  1. Conecte-se ao nó principal do cluster e inicie o HPC Cluster Manager.

  2. Em Gerenciamento de Recursos, verifique se os nós de computação do Linux estão no estado Online. Se não estiverem, selecione-os e clique em Colocar Online.

  3. Em Gerenciamento de Tarefas , clique em Novo Trabalho.

  4. Insira um nome para o trabalho, como hpccharmrun.

    Novo trabalho de HPC

  5. Na página Detalhes do Trabalho, em Recursos do Trabalho, selecione o tipo de recurso como e defina o Mínimo como 3. , realizamos a tarefa em três nós Linux, e cada nó possui quatro núcleos.

    Recursos de trabalho

  6. Clique em Editar Tarefas no painel de navegação à esquerda e, em seguida, clique em Adicionar para adicionar uma tarefa à lista de tarefas.

  7. Na página Detalhes da Tarefa e Redirecionamento de E/S, defina os seguintes valores:

    • Linha de comandos - /namd2/hpccharmrun.sh ++remote-shell ssh /namd2/namd2 /namd2/namdsample/1-2-sphere/ubq_ws_eq.conf > /namd2/namd2_hpccharmrun.log

      Sugestão

      A linha de comando anterior é um único comando sem quebras de linha. É ajustado para aparecer em várias linhas sob a linha de comando .

    • Diretório de trabalho - /namd2

    • Mínimo - 3

      Detalhes da tarefa

      Observação

      Define o diretório de trabalho aqui porque o charmrun tenta acessar o mesmo diretório de trabalho em cada nó. Se o diretório de trabalho não estiver definido, o HPC Pack iniciará o comando em uma pasta nomeada aleatoriamente criada em um dos nós do Linux. Isso causa o seguinte erro nos outros nós: /bin/bash: line 37: cd: /tmp/nodemanager_task_94_0.mFlQSN: No such file or directory. Para evitar esse problema, especifique um caminho de pasta que pode ser acessado por todos os nós como o diretório de trabalho.

  8. Clique em OK e, em seguida, clique em Enviar para executar este trabalho.

    Por padrão, o HPC Pack envia o trabalho como sua conta de usuário conectada atual. Uma caixa de diálogo pode solicitar que você insira o nome de usuário e a senha depois de clicar em Enviar.

    Credenciais de trabalho

    Em algumas condições, o HPC Pack memoriza as informações do utilizador que introduziu anteriormente e não mostra esta caixa de diálogo. Para fazer com que o HPC Pack o mostre novamente, digite o seguinte comando em um prompt de comando e envie o trabalho.

    hpccred delcreds
    
  9. O trabalho leva vários minutos para ser concluído.

  10. Encontre o log de tarefas em \\Namd\namd2\namd2_hpccharmrun.log e os arquivos de saída em \\Namd\namd2\namdsample\1-2-sphere.

  11. Se quiser, inicie o VMD para ver os resultados do seu trabalho. As etapas para visualizar os arquivos de saída NAMD (neste caso, uma molécula de proteína ubiquitina em uma esfera de água) estão além do escopo deste artigo. Consulte o tutorial NAMD para obter detalhes.

    Resultados do trabalho

Arquivos de exemplo

Arquivo de configuração XML de exemplo para implantação de cluster por script do 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>    

Exemplo de arquivo cred.xml

<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>

Exemplo de script hpccharmrun.sh

#!/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}