Durante a última década, os processadores multicoredominaram o mercado de PCs, Portáteis, Tablets e Smartphones. Os processadores de vários núcleos são capazes de executar várias instruções ao mesmo tempo, o que permite um aumento de desempenho das aplicações. É nos dispositivos menos poderosos, como os telemóveis, que os utilizadores percepcionam os maiores incrementos de performance, muito graças ao que ficou popularizado como o “verdadeiro” Multitasking.

O Multitasking dá aos utilizadores a possibilidade de executar várias aplicações em simultâneo. No entanto, dentro de cada uma destas aplicações quase nada mudou. As instruções continuam a ser executadas sequencialmente e não em paralelo, como seria adequado numa plataforma multicore. Por mais cores que estejam disponíveis, por mais “poderosa” que seja a máquina, um programa deste género irá executar à velocidade máxima que cada core oferece individualmente, sendo praticamente irrelevante o número total de cores que se encontram disponíveis.

Uma técnica habitual para aumentar o desempenho dos multicores sem afectar demasiado o consumo energético é aumentar o número de cores mas diminuir a velocidade de relógio que cada core oferece. Esta abordagem resulta se os programas estiverem preparados para executar de acordo com esta filosofia. Mas, se assim não for, a compra de um novo equipamento terá muitas vezes um efeito contrário ao desejado: as nossas aplicações poderão mesmo passar a executar mais lentamente. Hoje em dia, comprar equipamento mais moderno quase nunca é a solução para problemas de performance. Isto conduz-nos à nossa próxima questão “porque é que não estão todos os programas preparados para executar internamente em paralelo e fazer uso de todo o potencial computacional existente nos multicores?” A resposta é simples, embora não muito satisfatória: a programação de aplicações paralelas é um tarefa complexa, difícil e que pode potencialmente introduzir toda uma nova dimensão de problemas e erros de execução inexistentes nas aplicações sequenciais.

Uma das linhas de I&DT atuais, tanto na academia como nas grandes empresas de IT e laboratórios de investigação por esse mundo fora, consiste em descobrir novos modelos de representar o paralelismo e a concorrência de forma a diminuir a complexidade implícita na sua implementação. Este esforço personifica diferentes dimensões, ao nível das plataformas, das frameworks e da tecnologia em geral, mas também ao nível das linguagens de programação em que estas aplicações são desenvolvidas. As linguagens atuais, como por exemplo JAVA, C# e C, estão ser estendidas por meio de bibliotecas e novas propriedades (Futures, Fork-Join, Map-Reduce, Grand Central Dispatch da Apple, etc.). Por outro lado, também estão a ser criadas novas linguagens de programação claramente vocacionadas para o desenvolvimento de software paralelo. Exemplos disso são a X10 da IBM, Fortress da Oracle, Erlang da Ericsson e Scala criada no EPFL de Lausanne.

Estas linguagens estão muito longe de se tornarem tão populares como JAVA ou C# e muitas nunca passarão do domínio da investigação, no entanto parte das novidades que estas linguagens estão a introduzir irão no futuro encontrar caminho para as linguagens mais populares. É por esta razão que vale a pena olhar para elas e descobrir de que forma estão a melhorar a tarefa de escrever programas paralelos, qual será o seu impacto na performance final dos programas e até que ponto serão bem sucedidas em explorar todo o poder computacional latente nos processadores multicore. Pois estes, vieram para ficar.

Fonte:

Share

Leave a Reply