Programação Concorrente e Distribuída
Por: Danielly Albuquerque • 28/10/2018 • Relatório de pesquisa • 999 Palavras (4 Páginas) • 154 Visualizações
Universidade Federal do Rio Grande do Norte
Engenharia da Computação e Automação
Programação Concorrente e Distribuida
Aluna: Danielly Fernandes de Albuquerque
Questões:
3.1 –
Ao realizar a alteração e utilizar strlen (greeting) ocorre o seguinte erro:
[pic 1]
[pic 2]
Isso acontece porque o caracter de terminação da string “\0”, usado para finalizar
strings em C, é ignorado. Com isso, ocorre comportamentos inesperados, como
imprimir lixo vindo da memória junto com a mensagem.
Já ao usar MAX_STRING não será possível notar nenhuma diferença nos
resultados a serem impressos. Isso porque é criado strings de tamanhos definidos
para haver espaço.
3.2 –
Para realizar o cálculo alguns processos terão que aplicar a regra com um número maior de trapezóides quando o “comm_sz” não for divisível por n. O resto da divisão deve ser redistribuídos entre os processos a começar pelo processo 0. Com isso, é modificada as linhas que calculam o valor das variáveis local_n e
local_a:
[pic 3]
3.5 –
Teorema: Se T é uma árvore binária completa (cheia) com n folhas, então a
profundidade das folhas é d=log2(n) .
Prova:
Passo base: Para n=1 :
d=log2(1)=0
Que é verdadeiro.
Hipótese de indução: Assumimos que o teorema é verdadeiro quando n = k. Como a árvore é completa (cheia), o número de folhas dobra cada vez que a árvore cresce, de modo que n=k=1.2.2.2...2=2m. Logo,
d=log2(k )=log2(2m)=m
Passo indutivo: Devemos mostrar que, para o número imediatamente seguinte de folhas, isto é, n=2k, d = m + 1:
d = log2(2k)
= log2(2) + log2(k) [Propriedade do logaritmo]
= log2(k) + log2(2) [Associatividade de adição]
= m + 1 [Hipótese de indução]
3.6 –
a) Em uma divisão em bloco, o número de elementos é divido igualmente e em
ordem entre os processos.
Caso o resultado da divisão entre n(numero de elementos) e comm_sz tenha resto, a distribuição é feita entre os processos.
Na questão, cada processo receberá a divisão inteira de n/comm_sz = 14/4 = 3.
Como essa divisão possui resto de valor 2, então os processos 0 e 1 irão receber 4 elementos cada e o restante receberá 3.
[pic 4]
b) Em uma distribuição cíclica, o número n de elementos é distribuído um por vez em cada processo em um determinado número de ciclos.
Nesse caso, o elemento x[0] vai para o processo 0, o x[1] vai para o processo 1, o x[2] vai para o processo 2 e o x[3] vai para o processo 3, fechando um ciclo. O
próximo ciclo segue a mesma lógica.
[pic 5]
c) Em uma distribuição bloco-cíclica, ocorre uma junção das propriedades de bloco e cíclica. Para um determinado b, o vetor x de n elementos seria dividido em blocos.
No caso, número de blocos seria n/b = 14/2 = 7. Caso a divisão inteira tivesse resto, ele seria distribuído entre os blocos seguindo sempre a mesma ordem.
[pic 6]
3.7 - A comunicação das funções coletivas do MPI são dadas por "todos-para-um", "um-para-todos" e "todos-para-todos".
Se considerarmos nesse caso, existindo um único processo, uma comunicação
"todos-para-todos" não haveria problemas no programa.
Seria um caso de enviar e receber pelo mesmo processo.
3.8 - No MPI_SCATTER ocorre que um processo manda informações diferentes, mas de mesmo tamanho para todos os outros processos.
Como o processo 0 distribui os n elementos igualmente (dividindo pela metade),
temos:
[pic 7]
b) O MPI_GATHER cada processo manda uma informação diferente para o mesmo processo raiz.
Nesse caso, o processo 0 recebe dos demais processos, dessa forma a árvore ficou da seguinte maneira:
[pic 8]
3.10 –
O parâmetro recv_count é a quantidade de elementos que será recebida.
O parâmetro send_count é a quantidade de elementos enviada pelo processo 0 aos outros processos.
São considerados argumentos de entrada para a função, por isso não há problema com a chamada da função quando supõe-se que dois argumentos sejam alinhados com e se referem ao mesmo bloco de memória.
...