Kapittel 3: Mangfoldsarbeid i Kulturrådet
3.3. Overordnet om arbeid opp mot råd, styre og utvalg (RSU)
Os design patterns são expressões de alto nível que generalizam algoritmos para- lelos que representam um problema paralelo recorrente [20]. Um design pattern não é um modelo acabado, que pode ser transformado directamente em código, mas sim uma descrição de como podemos resolver um problema que pode ser usado em várias situações. A ideia é registar as experiências dos especialistas de uma maneira que as suas soluções possam ser utilizadas por outros enfrentando problemas semelhantes. A ideia de capturar soluções recorrentes na área de arquitectura, e os apresentar de uma forma textual, ilustrando a sua utilização, implementação e relação com outros pa- drões, surgiu pela primeira vez no trabalho de Alexander [37]. Neste trabalho existe uma série de padrões por onde escolher e também uma linguagem de padrões que in-
22
troduz uma nova abordagem para o desenho das aplicações. Nesta linguagem, os pa- drões estão organizados numa estrutura que leva o utilizador através de uma série de padrões que permite o desenho de sistemas complexos usando padrões. Em cada pon- to de decisão, o utilizador escolhe o padrão mais apropriado (apesar do uso do termo linguagem, a linguagem de padrões não é uma linguagem de programação). Inspirado neste trabalho, surgiu o livro sobre Design Patterns [42] no contexto dos sistemas dis- tribuídos e do modelo Object-Oriented, sendo seguido por outros trabalhos.
No livro [38] a linguagem de padrões paralelos está organizada em 4 espaços, formando uma hierarquia:
1. Encontrar Concorrência: exposição da concorrência de um problema que
pode ser explorada;
2. Estrutura do Algoritmo: estruturar o algoritmo para tirar vantagem da po-
tencial concorrência;
3. Estruturas de Suporte: ligação entre o nível superior e o nível inferior. Exis-
tem dois grupos de padrões neste espaço, aqueles que representam as abor- dagens da estruturação do programa e aqueles que representam as estrutu- ras mais comuns de memória partilhada;
4. Mecanismos de Implementação: como é que os padrões dos níveis mais al-
tos são mapeados em ambientes de programação específicos. É usado para descrever mecanismos comuns de gestão e interacção de processos.
Segue-se um exemplo da utilização desta abordagem no problema da reconstru- ção de imagens médicas. Para resolver este problema, é necessário criar modelos de propagação da radiação pelo corpo dos pacientes. A ideia é que temos uma partícula (raio) que passa pelo corpo do paciente, e é atenuada pelos diferentes órgãos por onde passa, continuando até sair do corpo e atingir um detetor, definindo uma trajectória. Para uma reconstrução é necessário milhares, e por vezes milhões, de raios.
É natural associar cada tarefa a cada raio (task decomposition pattern). Estas tare- fas são fáceis de gerir concorrentemente porque são completamente independente umas das outras. Tendo as tarefas definidas, consideramos então a decomposição dos dados. Cada tarefa necessita de manter a informação que define a trajectória do raio. Para além disso, as tarefas necessitam de ter acesso ao modelo do corpo. Como o mo- delo é apenas acedido para leituras, não existem problema se estamos perante um sis- tema de memória partilhada, cada tarefa pode ler os valores quando precisa.
Visto que as tarefas são independentes umas das outras, a única questão com que temos que nos preocupar quando escolhemos a estrutura do algoritmo é como mapear
23
as tarefas. Para este problema, o princípio de organização parece ser como as tarefas estão organizadas. De seguida, consideramos a natureza do nosso grupo de tarefas, se estas estão organizadas numa hierarquia ou se não existe organização. Para este pro- blema, as tarefas não estão organizadas e não existe uma estrutura hierárquica entre elas, por isso escolhemos o padrão Data Parallel. Todo este processo de identificação dos padrões está explicado no livro [38], este exemplo apenas ilustra como é que iden- tificamos os padrões para um problema real recorrente.
Kurt Keutzer e Tim Mattson [39] identificaram diversos padrões e estruturaram- nos em camadas usando uma abordagem de engenharia de software. Desenhar pro- gramas paralelos é complexo. Para gerir esta complexidade, a sua abordagem passa por dividir o problema numa hierarquia em camadas. Cada nível da hierarquia trata de uma parte do problema. Quem gere o desenvolvimento de uma aplicação paralela tem que perceber todas as camadas da hierarquia, mas na prática a maior parte dos programadores numa aplicação pode restringir o seu trabalho ao nível que está direc- tamente associado à sua parte da aplicação. As duas primeiras categorias estão no mesmo nível da hierarquia, cooperando para criar uma camada de arquitectura de software identificada como “camada de produtividade”. Os padrões a este nível são utilizados por engenheiros e cientistas, e capturam soluções próximas dos seus domí- nios de aplicação. Estas duas categorias definem a arquitectura de software de alto ní- vel de uma aplicação.
1. Padrões de estruturação: descreve a organização da aplicação e a forma
como os elementos computacionais que formam a aplicação interagem.
2. Padrões computacionais: descrevem as classes essenciais que formam a
aplicação. Estes padrões descrevem o que é computado no que foi definido pelos padrões de estruturação.
As categorias seguintes definem a “camada de eficiência”, cujos padrões captu- ram conhecimento adquirido na área de paralelismo.
3. Estratégias do algoritmo: definem estratégias de alto nível para explorar a
concorrência numa computação para ser executada num computador para- lelo.
4. Estratégias de implementação: como é que o programa em si está organi-
zado e estruturas de dados comuns específicas para programação paralela.
5. Padrões de execução paralela: abordagens usadas para suportar a execução
de um algoritmo paralelo. Por exemplo, construção de blocos básicos para coordenação das tarefas.
24
De notar que nas primeiras duas categorias não é dito nada sobre paralelismo. Nestas categorias o importante é saber quais os padrões mais relacionados com o do- mínio da aplicação, dando uma visão de alto nível sobre o problema. Por outro lado, nas categorias seguintes, é feita uma descrição focada na implementação de programas paralelos. Esta divisão permite que numa camada superior seja possível usar os pa- drões sem necessidade de preocupar com o paralelismo, permitindo um desenvolvi- mento mais rápido das aplicações. A camada inferior permite a programadores mais experientes implementarem os padrões, de forma optimizada, para estes sejam dispo- nibilizados na camada superior.