Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
A computação paralela com MPI inicia-se simultaneamente com múltiplos processadores (instâncias de processamento), cada um utilizando seu próprio endereço de memória (memória distribuída). Cada processo lê e escreve em seu próprio endereço de memória privada. Observamos que o processamento já inicia-se ramificado e distribuído, sendo possível a comunicação entre os processos por instruções explícitas (instruções MPI, Message Passing Interface). A sincronização entre os processos também requer instruções específicas.
Vamos escrever nosso primeiro código MPI. O Código ola.cpp
é paralelamente executado por diferentes processadores, cada processo escreve “Olá” e identifica-se.
Na linha 4, o API Open MPI é incluído no código. O ambiente MPI é inicializado na linha 10 com a rotina MPI_init inicializa o ambiente MPI. Na inicialização, o comunicador MPI_COMM_WORLD é construído entre todos os processos inicializados e um identificador (rank) é atribuído a cada processo. O número total de processos é obtido com a rotina MPI_Comm_size. Cada processo é identificado por um número natural sequencial 0, 1, …, world_size-1. O identificador (rank) de um processo é obtido com a rotina MPI_Comm_rank (veja a linha 18). A rotina MPI_Finalize finaliza o ambiente MPI.
Para compilar este código, podemos digitar no terminal
Esta instrução de compilação é análoga a
ou semelhante dependendo da instalação. Para ver a sua configuração, digite
Ao compilar, um executável a.out será criado. Para executá-lo, basta digitar no terminal:
Esta instrução inicializa simultaneamente 4 cópias (-np 4, dois processos) do código ola.cpp (do executável a.out). Cada processo é executado de forma independente (em paralelo e não sincronizados).
Ao executar, devemos ver a saída do terminal como algo parecido com
A saída irá variar conforme o processo que primeiro enviar a mensagem para o dispositivo de saída. Execute o código várias vezes e analise as saídas!
Por padrão, o MPI não permite a execução de um número de processos menor ou igual ao número de núcleos (cores) disponíveis na máquina. Para permitir a execução nas threads disponíveis, deve-se utilizar a opção --use-hwthreads-cpus na linha de comando mpirun. Verifique!
O seguinte código pode ser executado com 2 instâncias de processamento. Cada processo recebe os números inteiros
int n = 2; int m = 3;
Então, um dos processos computa e imprime a soma e o outro o produto.
Neste código, os processos são abortados caso o usuário tente executá-lo com um número de processos diferente de 2. Para abortar todos os processos ativos, utiliza-se a rotina MPI_Abort (consulte as linhas 16-22). O argumento de entrada errorcode é arbitrário e serve para informar a usuária de uma categoria de erros conforme a política de programação utilizada.
MPI_Abort é uma rotina de comunicação coletiva e não requer sincronização entre os processos. O primeiro processo a executá-la aborta todos os demais processos ativos. A execução do código é interrompida e o sistema operacional retorna ao terminal.
Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.
Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
A computação paralela com MPI inicia-se simultaneamente com múltiplos processadores (instâncias de processamento), cada um utilizando seu próprio endereço de memória (memória distribuída). Cada processo lê e escreve em seu próprio endereço de memória privada. Observamos que o processamento já inicia-se ramificado e distribuído, sendo possível a comunicação entre os processos por instruções explícitas (instruções MPI, Message Passing Interface). A sincronização entre os processos também requer instruções específicas.
Vamos escrever nosso primeiro código MPI. O Código ola.cpp
é paralelamente executado por diferentes processadores, cada processo escreve “Olá” e identifica-se.
Na linha 4, o API Open MPI é incluído no código. O ambiente MPI é inicializado na linha 10 com a rotina MPI_init inicializa o ambiente MPI. Na inicialização, o comunicador MPI_COMM_WORLD é construído entre todos os processos inicializados e um identificador (rank) é atribuído a cada processo. O número total de processos é obtido com a rotina MPI_Comm_size. Cada processo é identificado por um número natural sequencial 0, 1, …, world_size-1. O identificador (rank) de um processo é obtido com a rotina MPI_Comm_rank (veja a linha 18). A rotina MPI_Finalize finaliza o ambiente MPI.
Para compilar este código, podemos digitar no terminal
Esta instrução de compilação é análoga a
ou semelhante dependendo da instalação. Para ver a sua configuração, digite
Ao compilar, um executável a.out será criado. Para executá-lo, basta digitar no terminal:
Esta instrução inicializa simultaneamente 4 cópias (-np 4, dois processos) do código ola.cpp (do executável a.out). Cada processo é executado de forma independente (em paralelo e não sincronizados).
Ao executar, devemos ver a saída do terminal como algo parecido com
A saída irá variar conforme o processo que primeiro enviar a mensagem para o dispositivo de saída. Execute o código várias vezes e analise as saídas!
Por padrão, o MPI não permite a execução de um número de processos menor ou igual ao número de núcleos (cores) disponíveis na máquina. Para permitir a execução nas threads disponíveis, deve-se utilizar a opção --use-hwthreads-cpus na linha de comando mpirun. Verifique!
O seguinte código pode ser executado com 2 instâncias de processamento. Cada processo recebe os números inteiros
int n = 2; int m = 3;
Então, um dos processos computa e imprime a soma e o outro o produto.
Neste código, os processos são abortados caso o usuário tente executá-lo com um número de processos diferente de 2. Para abortar todos os processos ativos, utiliza-se a rotina MPI_Abort (consulte as linhas 16-22). O argumento de entrada errorcode é arbitrário e serve para informar a usuária de uma categoria de erros conforme a política de programação utilizada.
MPI_Abort é uma rotina de comunicação coletiva e não requer sincronização entre os processos. O primeiro processo a executá-la aborta todos os demais processos ativos. A execução do código é interrompida e o sistema operacional retorna ao terminal.
Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.