|
Os grafos de dados são transformados em tempo de compilação
em blocos de códigos, possibilitando aos mesmos rodarem em vários
processadores da máquina. Estes processadores são homogêneos e com memória distribuída. Bloco de Códigos Normalmente, como visto antes, as máquinas dataflow só executam uma instrução quando todos os dados para aquela instrução estiverem disponíveis. Em virtude da quantidade de bits necessários para gerenciar corretamente cada token, a máquina ADAM trabalha com uma granulosidade um pouco mais alta, denominada Codeblocs. Estes blocos de código são gerados por um compilador e cada um deles é executado de forma sequencial no processador, mas podem ser executados de forma concorrente. Este é o principal diferencial entre as outras máquinas dataflow, já que estas consideram cada token para uma única instrução enquanto que a ADAM considera como token este bloco de instruções. Difere também das máquinas controlflow (Von Neumann) pelo fato de que chamadas a funções não causam a parada da execução, mas ela continua se os dados necessários estão presentes. Com isso, pode-se obter um nível de paralelismo bem eficiente, desde que os blocos de código sejam gerados de forma satisfatória. |
Conclusão
As máquinas dataflow foram tidas como revolucionárias quando idealizadas. Na prática, porém, estão ainda ineficientes. A ineficiência se deve ao fato de que as Von Neumann, mesmo com todos os seus problemas e com o custo necessário para resolvê-los ou evitá-los, ainda se mostra incrivelmente mais rápida. A Dataflow, mesmo que tenha se livrado de alguns destes problemas, ainda executa de forma lenta e tem outros problemas, como, por exemplo, a estrutura de dados necessárias para gerenciar o próprio dado que agora deve conter o dado e uma informação (cabeçalho). para contextualizá-lo no sistema, já que é o dado quem procura a instrução e não a instrução quem procura seus dados. A máquina ADAM foi inovadora no sentido de aumentar então, a granulosidade do token (que inicialmente era o mero dado), gerando bloco de códigos. Com estes blocos, minimiza-se os custos para gerenciá-lo, mas volta-se a ter os problemas de Von Neumann dentro de cada bloco. O lado Dataflow da mesma pode ser observado nas chamadas não bloqueantes de função e da execução de laços e funções somente com a disponibilidade dos dados. A alternativa de se fazer uma fusão entre as duas arquiteturas trouxe características desejáveis, mas não eliminou os problemas por completo. |