3.2 Estruturando Componentes Compostos
3.2.4 Configurando Argumentos e Pontos de Retorno do Componente
Os argumentos e pontos de retorno declarados no cabe¸calho da configura¸c˜ao de um componente devem ser associados a portas de entrada e sa´ıda, respectivamente, perten- centes a unidades declaradas na configura¸c˜ao. Estas portas n˜ao devem estar conectadas a nenhuma outra porta por meio de canais. A declara¸c˜ao bind ´e empregada com este prop´osito, como ilustrado no seguinte exemplo:
component PIPE<N> in → out with ..
.
bind pipe[1]←in to in bind pipe[N]→out to out
Neste, a porta de entrada in da unidade pipe[1] ´e associada ao ponto de entrada in do componente PIPE. Analogamente, a porta de sa´ıda out da unidade pipe[n] ´e associada ao ponto de sa´ıda out do mesmo componente.
3.2.5 Especificando a Computa¸c˜ao Realizada por uma Unidade
A configura¸c˜ao de uma unidade deve ainda descrever a computa¸c˜ao que esta deve realizar. Para isso, a cada unidade ´e associada um componente, o qual descreve sua funcionalidade. A compatibiliza¸c˜ao entre o componente e a unidade ´e concretizada pela
defini¸c˜ao de um mapeamento injetivo entre os argumentos e pontos de retorno do com- ponente `as portas de entrada e sa´ıda da interface da unidade, respectivamente. Um argumento associado a uma porta de entrada deve receber seus valores atuais a partir desta, como efeito colateral de sua ativa¸c˜ao. Quando n˜ao associado a uma porta de en- trada, um argumento deve receber seu valor explitamente. Analogamente, um valor de retorno associado a uma porta de sa´ıda deve ser enviado atrav´es desta, quando ativada. Caso contr´ario, ´e ignorado.
Ainda com respeito a compatibilidade da associa¸c˜ao entre componentes e unidades, a ordem de ativa¸c˜ao descrita para as portas da interface da unidade deve ser uma ordem v´alida com respeito a demanda de consumo dos argumentos e produ¸c˜ao dos valores de retorno do componente, obedecendo o mapeamento especificado. Dessa forma, sempre que, durante a execu¸c˜ao de uma unidade, um valor de um argumento do componente ´e requerido, a porta de entrada associada ao argumento deve ter sido ativada em um momento anterior, de forma que o valor esteja dispon´ıvel. Analogamente, no momento da ativa¸c˜ao de uma porta de sa´ıda, um valor deve ter sido produzido no ponto de retorno correspondente. A incompatibilidade entre componente e unidade causa um erro em tempo de execu¸c˜ao. Entretanto, o modelo # permite que erros desse tipo possam ser apresentados de forma compreens´ıvel ao especialista humano, facilitando a depura¸c˜ao de erros l´ogicos em tempo de execu¸c˜ao, uma das vantagens dessa abordagem em rela¸c˜ao a programa¸c˜ao MPI pura, onde a dificuldade de depura¸c˜ao de programas constitui um de seus pontos fracos.
choice Grupo de Portas non−choice Grupo de Portas a[1] a[2] ! ... ... a[i] a[n] a[1] a[2] a[i] a[n] a[1] a[2] a[n] ligacao funcao de ~ ~ ~ ~ ligacao funcao de ~ ~ ~ ~ ligacao funcao de ~ ~ ~ ~ ligacao funcao de ~ ~ ~ ~ ligacao funcao de ~ ~ ~ ~ ligacao funcao de ~ ~ ~ ~ ... a[1] a[2] a[n] ! ! ! ! ... ... ... Portas Individuais ! ! a a
Figura 3.5. Agrupamentos de Portas
3.2.5.1 Fun¸c˜oes de liga¸c˜ao s˜ao suportadas para aumentar a capacidade de com- patibiliza¸c˜ao entre componentes e unidades. S˜ao associadas a portas de entrada e sa´ıda na configura¸c˜ao de unidades. Em portas de entrada, a fun¸c˜ao de liga¸c˜ao ´e aplicada ao valor recebido atrav´es desta. O valor retornado ´e ent˜ao passado ao argumento associado `a porta em quest˜ao. Analogamente, em portas de sa´ıda, a fun¸c˜ao de liga¸c˜ao ´e aplicada ao valor produzido no ponto de retorno associado. O valor retornado ´e enviado atrav´es da porta de sa´ıda em quest˜ao. Assume-se a fun¸c˜ao identidade (id) como default, sempre
que a fun¸c˜ao de liga¸c˜ao n˜ao ´e especificada explicitamente.
Fun¸c˜oes de liga¸c˜ao s˜ao particularmente ´uteis quando associadas a agrupamentos de portas. Com rela¸c˜ao ao tipo de fun¸c˜ao de liga¸c˜ao associado a um agrupamento, este pode ser classificado como choice ou non-choice. Em agrupamentos de portas de entrada do tipo non-choice, a fun¸c˜ao de liga¸c˜ao mapeia o conjunto formado pelos valores recebidos por cada porta individual pertencente ao agrupamento em um ´unico valor, o qual ´e passado ao argumento associado. Em agrupamentos de portas de sa´ıda do tipo non-
choice, a fun¸c˜ao de liga¸c˜ao mapeia o valor ´unico produzido em um ponto de retorno em
um conjunto de valores, enviados por cada uma das portas individuais do agrupamento. Em agrupamentos de portas do tipo choice, a fun¸c˜ao de liga¸c˜ao atua de forma an´aloga ao descrito para portas individuais. Para que isto seja poss´ıvel, uma das portas ´e escolhida n˜ao-determiniscamente, dentre aquelas cujo par de comunica¸c˜ao encontra-se ativado. A palavra reservada choice ´e usada para especificar grupos de porta do tipo choice, seguida da fun¸c˜ao de liga¸c˜ao. Sua ausˆencia indica que a porta ´e do tipo non-choice, sendo necess´ario somente a especifica¸c˜ao da fun¸c˜ao de liga¸c˜ao. A fun¸c˜ao de liga¸c˜ao default para um grupo choice ´e id. A Figura 3.5 ilustra a semˆantica de fun¸c˜oes de liga¸c˜ao quando aplicadas a portas individuais ou grupos de portas.
uExample2 #ExtMerge2 3 valor ignorado a mA.l2* mB.l1* mB.l2* mA.l1* mA.l3* b mB.l3* CExample distribute transform id
unit uExample2 # ExtMerge2 groups a<3>: choice, mA.l1:transform, mB.l3<5>:distribute
as CExample<5,“uExample2”> (3,a,mA.l1,mA.l2,mB.l1,mB.l2) → (mA.l3,mB.l3, , b)
Figura 3.6. Associa¸c˜ao de Componentes `a Unidades
3.2.5.2 Exemplo A Figura 3.6 ilustra a associa¸c˜ao entre unidades e componentes. A unidade uExample2, instanciada a partir da interface ExtMerge2 (Figura 3.2), ´e associada ao componente CExample. Ao quarto argumento do componente CExample ´e atribu´ıdo um valor expl´ıcito (3), n˜ao sendo este portanto associado a uma porta de entrada. O mesmo pode ser afirmado com rela¸c˜ao ao segundo ponto de retorno deste componente, cujo valor ´e ignorado. Os valores entre os delimitadores < e > s˜ao os parˆametros est´aticos atuais passados ao componente e podem ser omitidos quando o componente n˜ao os exige. As portas a e mB.l3 s˜ao replicadas de maneira a formar agrupamentos de 3 e 5 portas, respectivamente. O agrupamento de portas mB.l3 ´e do tipo non-choice, com fun¸c˜ao de liga¸c˜ao distribute, enquanto o agrupamento a ´e do tipo choice com fun¸c˜ao de liga¸c˜ao
ignorado
ignorado valor
valor
a expr 2
module Example(main) where main x y z = ... return (v,w) main :: t −> u −> v −> IO (r, s, q)
Aglomerado Processo
expr::t
Figura 3.7. Aglomerados e Processos
Unidade Principal
Processo Funcional Aglomerado Componente Composto Componente Simples
Figura 3.8. Hierarquia de Unidades em um Programa #
3.2.5.3 Aglomerados e Processos Unidades associadas a componentes compostos s˜ao denominadas aglomerados, enquanto aquelas associadas a componentes simples s˜ao denominadas processos. Portanto, aglomerados s˜ao unidades que implementam com- puta¸c˜oes paralelas, enquanto processos implementam computa¸c˜oes sequenciais. A Figura 3.7 ilustra o mapeamento de argumentos e pontos de retorno em aglomerados e processos. A capacidade de associar-se unidades a componentes simples, formando processos, consti- tui a “cola” que une os meios de coordena¸c˜ao e computa¸c˜ao no modelo #. Na Figura 3.8, ilustra-se a hierarquia de unidades em uma aplica¸c˜ao. As unidades representadas nos n´os da ´arvore s˜ao aglomerados, enquanto unidades representadas em suas folhas constituem processos.