Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
A computação paralela com MP inicia-se por uma instância de processamento master thread. Todas as instâncias de processamento disponíveis (threads) leem e escrevem variáveis compartilhadas. A ramificação (fork) do processo entre os threads disponíveis é feita por instrução explícita no início de uma região paralela do código. Ao final da região paralela, todos os threads sincronizam-se e o processo segue apenas com o master thread. Veja a Figura 2.1.
Vamos escrever nosso primeiro código MP.
Na linha 4, a API OpenMP é incluída no código. A região paralela vale dentro do escopo iniciado pela instrução
i.e., entre as linhas 9 e 15. Em paralelo, cada thread registra seu número de identificação na variável inteira id (linha 12). Na linha 14, escrevem a saudação, identificando-se.
O código pode ser compilado com
Ao compilar, um executável a.out será criado. Ao executar, devemos ver a saída do terminal parecida com
A saída irá depender do número de threads disponíveis na máquina e a ordem dos threads pode variar a cada execução. Execute o código várias vezes e verifique!
As variáveis declaradas dentro de uma região paralela são privadas de cada thread. As variáveis declaradas fora de uma região paralela são compartilhadas, sendo acessíveis por todos os threads.
Por padrão, o número de threads disponíveis é o número de núcleos disponíveis na máquina. Alternativamente, o número de threads a serem disponibilizados pode ser alterado com o método omp_set_num_threads(int n). Analogamente, o método omp_get_num_threads() retorna o número total de threads disponibilizados.
O seguinte código computa a soma entre dois vetores de números randômicos em ponto flutuante. Para a distribuição da tarefa, os vetores são divididos em pedaços (chunks) de tamanho , onde é o número de threads disponíveis. Cada thread computa a soma dos elementos do seu respectivo pedaço.
Escreva um código MP para ser executado com 2 threads. A master thread deve ler dois números em ponto flutuante. Então, em paralelo, uma duas threads deve calcular a soma dos dois números e a outra thread deve calcular o produto.
Faça um código MP para ser executado com 2 threads. O master thread deve ler dois números e não nulos em ponto flutuante. Em paralelo, um dos thread deve computar e o outro deve computar . Por fim, o master thread deve escrever .
Escreva um código MP para computar a multiplicação de uma matriz com um vetor de elementos. Inicialize todos os elementos com números randômicos em ponto flutuante. Ainda, o código deve ser escrito para um número arbitrário de instâncias de processamento. Por fim, compare o desempenho do código MP com uma versão serial do código.
Escreva um código MP para computar o produto de uma matriz com uma matriz de elementos, com . Inicialize todos os elementos com números randômicos em ponto flutuante. Ainda, o código deve ser escrito para um número arbitrário de instâncias de processamento. Por fim, compare o desempenho do código MP com uma versão serial do código.
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 MP inicia-se por uma instância de processamento master thread. Todas as instâncias de processamento disponíveis (threads) leem e escrevem variáveis compartilhadas. A ramificação (fork) do processo entre os threads disponíveis é feita por instrução explícita no início de uma região paralela do código. Ao final da região paralela, todos os threads sincronizam-se e o processo segue apenas com o master thread. Veja a Figura 2.1.
Vamos escrever nosso primeiro código MP.
Na linha 4, a API OpenMP é incluída no código. A região paralela vale dentro do escopo iniciado pela instrução
i.e., entre as linhas 9 e 15. Em paralelo, cada thread registra seu número de identificação na variável inteira id (linha 12). Na linha 14, escrevem a saudação, identificando-se.
O código pode ser compilado com
Ao compilar, um executável a.out será criado. Ao executar, devemos ver a saída do terminal parecida com
A saída irá depender do número de threads disponíveis na máquina e a ordem dos threads pode variar a cada execução. Execute o código várias vezes e verifique!
As variáveis declaradas dentro de uma região paralela são privadas de cada thread. As variáveis declaradas fora de uma região paralela são compartilhadas, sendo acessíveis por todos os threads.
Por padrão, o número de threads disponíveis é o número de núcleos disponíveis na máquina. Alternativamente, o número de threads a serem disponibilizados pode ser alterado com o método omp_set_num_threads(int n). Analogamente, o método omp_get_num_threads() retorna o número total de threads disponibilizados.
O seguinte código computa a soma entre dois vetores de números randômicos em ponto flutuante. Para a distribuição da tarefa, os vetores são divididos em pedaços (chunks) de tamanho , onde é o número de threads disponíveis. Cada thread computa a soma dos elementos do seu respectivo pedaço.
Escreva um código MP para ser executado com 2 threads. A master thread deve ler dois números em ponto flutuante. Então, em paralelo, uma duas threads deve calcular a soma dos dois números e a outra thread deve calcular o produto.
Faça um código MP para ser executado com 2 threads. O master thread deve ler dois números e não nulos em ponto flutuante. Em paralelo, um dos thread deve computar e o outro deve computar . Por fim, o master thread deve escrever .
Escreva um código MP para computar a multiplicação de uma matriz com um vetor de elementos. Inicialize todos os elementos com números randômicos em ponto flutuante. Ainda, o código deve ser escrito para um número arbitrário de instâncias de processamento. Por fim, compare o desempenho do código MP com uma versão serial do código.
Escreva um código MP para computar o produto de uma matriz com uma matriz de elementos, com . Inicialize todos os elementos com números randômicos em ponto flutuante. Ainda, o código deve ser escrito para um número arbitrário de instâncias de processamento. Por fim, compare o desempenho do código MP com uma versão serial do código.
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.