segunda-feira, 11 de outubro de 2010

A Síndrome de Von Neumann

No início da era da Computação, vários foram os esforços para que computadores mais eficientes fossem desenvolvidos, mas que principalmente houvesse um padrão de arquitetura. Arquiteturas heterogêneas implica em também diversas metodologias e paradigmas de programação.
Na década de 30 John Von Neumann, então professor e pesquisador da Universidade de Princeton, EUA, propôs uma arquitetura que revolucionou a computação. Desde então não se viu inovação que impactasse tanto a humanidade.
O que ele propôs foi que deveria haver uma memória que armazenasse tanto dados, como instruções a serem executadas por uma Unidade Central de Processamento (CPU). Tal unidade seria também responsável por ler a instruções dessa memória – armazenadas em código – decodificá-las e então executá-las. Essa proposta foi rapidamente acatada pela comunidade acadêmica e industrial devido a grande flexibilidade que isso significava. Como as instruções poderiam ser armazenadas em memória, fazer com que o computador executasse novas operações desejadas, bastaria escrever uma nova seqüência de instruções na memória. Daí se popularizou o software! Sendo assim, podemos dizer que Von Neumann é o pai do Software?
Aliada a essa inovação, uma outra criação veio revolucionar a humanidade. O transistor digital baseado em silício. Ele permitiu que computadores pudessem ser fabricados de larga escala. Com a miniaturização crescente dos transistores, processadores puderam ser fabricados cada vez menores e com mais transistores, portanto, com maior capacidade de processamento e maiores memórias para dados e a programas cada vez mais complexos.
Assim que os primeiros transistores começaram a ser fabricado, o cientista Gordon Moore, que acabava de fundar uma empresa com mais dois amigos para fabricação de microchips (a Intel) fez uma previsão no mínimo animadora. Ele previu que a tecnologia de fabricação de chips iria avançar tanto, que a cada 18 meses, o dobro de transistores seria colocado num chip sem que o preço de fabricação fosse modificado. E o que isso significava? Os processadores iriam dobrar sua velocidade a cada 18 meses! O mais lógico seria chamá-lo de ingênuo, ou simplesmente ignorá-lo. Isso se depois de um ano e meio depois sua previsão não tivesse se tornado realidade. Mais do que isso, sua previsão virou lei, sendo denominada Lei de Moore e tornou uma meta industrial! Toda a comunidade científica passou a buscar criar processadores cada vez mais rápidos, e parecia sempre muito gratificante ver o crescimento da tecnologia acompanhar a reta descrita por Moore. Mas uma falha muito óbvia em sua lei é que nada cresce para sempre! Tudo tem um fim.
Hoje em dia, a base da Arquitetura de von Neumann, o software, pode ser considerada um overhead. A vantagem do software é a flexibilidade que ele permite ao hardware. Cada instrução pode detalhar o que o hardware deve executar. Mas ao mesmo tempo, os passos básicos de processamento de instrução é geralmente muito custoso: carregamento, decodificação, carregamento de dados, execução e armazenamento de resultados. Como o avanço das memórias não acompanhou o avanço da velocidade de processamento, os processadores hoje são cerca de 3x mais velozes que as memórias mais rápidas. Sendo assim, o excesso de dependência dos processadores de acesso a memória (típico da Arquitetura de von Neumann) torna os computadores máquinas de baixíssima eficiência, tanto no processamento, quanto no consumo de energia! Para se ter uma visão mais concreta dessa ineficiência, basta observar quanto tempo o processador passa realmente processando dados. Numa máquina RISC típica, 5 ciclos de clock são necessários para cada instrução. Desses, apenas um (20%) é usado na execução propriamente dita da instrução. Se os dados necessários não estiverem na Memória Cache, isso pode piorar, caindo para cerca de 14,3%. Essa ineficiência pode ser reduzida se o processador usar Pipeline, mas isso dependerá de um bom compilador, de boa técnica de programação e de como o usuário irá usar o sistema.
Uma pergunta que você deve estar fazendo no momento é, se as computadores que conhecemos hoje não são eficiente, o que seriam então? Estariam todos errados e apenas esse cara que escreve esse blog estaria certo?
Há outras arquiteturas de computadores mais eficientes do que os processadores que conhecemos. A Computação Reconfigurável é uma tendência muito forte nesse sentido. Ela pode ser muito mais rápida, mais barata e consumir menos energia do que os processadores que conhecemos. A diferença é que ela não é tão fácil (ainda) de programar, nem tão flexível quanto os softwares. Entretanto, pesquisas já têm mostrado que chips Dinamicamente Reconfiguráveis podem adicionar o grau de flexibilidade – e de competitividade – que essas arquiteturas precisavam para competir diretamente com processadores de propósito geral.
Mas se fôssemos adotar essas arquiteturas, o que nós profissionais precisaríamos? Mudar a arquitetura tão radicalmente necessitaria de novas linguagens, paradigmas e técnicas de programação. Esse é o principal problema! Teríamos que causar uma revolução na educação básica da computação! O que temos que nos perguntar é, vamos esperar os computadores entrarem em colapso para mudarmos de paradigma, ou devemos estar preparados para essa mudança? Se os computadores são tão ineficientes no uso da energia elétrica, o que diriam os grandes servidores espalhados pelo mundo? Vamos nós da Ciência da Computação estarmos entre os principais causadores dos danos causados ao ambiente devido ao uso indevido da energia elétrica? Essas são questões que serão discutidas em outros momentos nesse blog. Mas uma coisa é certa, eu não vou ficar esperando quieto. E você?

11 comentários:

Neto disse...

Belo texto professor ^^

You will be seen as... disse...

Leitura agradável, perguntas interessantes ao longo do texto, muito bom!!! E se adicionarmos o paradigma de arquitetura quântica, o que seria/será do futuro da computação? Revolução total...

Luciano Henrique disse...

Bom texto Alisson, o que podemos considerar é a real evolução do hardware e uma tendência de serviços para software. Paradigmas precisam ser quebrados para romper barreiras culturais.
Vou repassar para meus alunos do P1 do IESP.

Anônimo disse...

Eu acho que ainda é cedo demais pra imaginar que vamos passar pra uma nova arquitetura de computadores, a dependência continua sendo grande demais em software e, especialmente, software difícil de ser otimizado "em separado", como o software comum escrito em linguagens estruturadas ou orientadas a objetos.

Acho que o que deve se confirmar no curto e médio prazo é a programação concorrente, especialmente graças ao grande flop que foi a tentativa da intel de inserir uma nova arquitetura (o Itanium) no mercado.

Conforme a necessidade de aumento de performance dos programas aumente e o clock dos processadores se mantenha constante e o único aumento significativo seja a quantidade de núcleos, vai ser realmente necessário procurar ferramentas e linguagens especializadas pra esse problema e podemos ver o ressurgimento de grandes nomes da velha guarda, como Lisp, Haskell e Erlang, ou as novas meninas dos olhos da programação funcional, Clojure e F#.

Com o foco voltado pra linguagens e ambientes concorrentes, que normalmente habitam o paradigma funcional e funcionam com zero de compartilhamento de memória, várias otimizações vão poder ser aplicadas ao código executado no final, o que deve aumentar ainda mais a performance nos ambientes que nós temos na atualidade. Acho que desse ponto estaríamos mais propensos a migrar pra arquiteturas de computação reconfigurável ou até mesmo uma outra arquitetura que venha a surgir no futuro.

Se eu bem me lembro, antes de falecer, Von Neumman estava também investigando a criação de uma nova arquitetura mais amigável a programação paralela, infelizmente ninguém surgiu depois pra dar continuidade ao trabalho.

Unknown disse...

A ideia de arquiteturas reconfiguráveis é bem interessante, embora ainda precise de muita pesquisa.

Com relação à arquitetura de Von Neummann, eu diria que nossos computadores hoje em dia são Von Neummann apenas em espírito. De importante da ideia original sobrou apenas a ideia do programa armazenado em memória, como mencionado no texto.

Acredito em em alguns nichos de aplicação têm grande potencial para adotar arquiteturas reconfiguráveis. Se isso vai ser uma mudança de paradigma mais geral, já é outra história, sabemos que é muito difícil alterar radicalmente como as coisas são feitas na indústria em pouco tempo.

Mas o papel da pesquisa é esse mesmo, olhar além do que se faz atualmente, ver o que pode ser aproveitado, e mudar a forma como se faz as coisas "no mundo real".

Unknown disse...

Discordo com Mauricio quando fala que é cedo demais para pensarmos em novas arquiteturas.
Na nossa área, 1 ano é um sopro, 5 anos é amanha, e 10 anos é curto prazo. Pensando assim, até pode ser. Em 10 anos, nao teremos mais os computadores que conhecemos hoje. Nem as linguagens de programacao que usamos habitualmente. Até lá, conseguiremos nos virar com nossos multicores (isso aqueles que programarem em linguagens paralelas como Erlang e Handel-C). Depois disso, viveremos outra era, que mudará tudo, deixando para traz inclusive essas linguagens que conhecemos hoje. Essas novas linguagens com certeza herdarão caracteristicas das linguagens que conhecemos hoje, mas serão de descrição de computação paralela, nao Thread-based como as que somos acostumados a trabalhar.

ESCOLA MUNICIPAL ANTENOR NAVARRO disse...

Grande texto Alysson ...gostaria que te arrumasse uma coluna em um portal aqui de Jampa?????????? seria interesante para ambos o site é www.fatospb.com.br

Meu email é: alyssoncalixto@ig.com.br

Unknown disse...

Sim, curto e médio prazo são realmente uma coisa bem "pequena" se nós compararmos computação com as outras ciências, mas acredito que uma aposta em linguagens concorrentes é uma boa.

Sobre novas linguagens, hoje eu não acredito mais nisso, não acho que vamos ver novas linguagens surgindo no futuro para atacar os problemas, o que se vê hoje é uma "volta as origens" e eu acredito que esse re-descobrimento de linguagens como Lisp e Haskell sejam um sinal de que elas foram criadas cedo demais e só hoje nós realmente temos capacidade de "deglutir" as suas estranhas sintaxes e comportamentos, além de contarmos com máquinas que são bem mais propensas a executar elas.

Já sobre linguagens com descrição de computação paralela, não tive contato com esse conceito ainda, mas as linguagens mais utilizadas pra programação concorrente de verdade, como Erlang, já aboliram o uso de threads (que não são um recurso barato) e estão seguindo o caminho de processos leves e programas escritos seguindo o modelo de atores ( http://en.wikipedia.org/wiki/Actor_model ) o que torna o fato de se estar programando em um ambiente concorrente/paralelo menos visível.

Unknown disse...

Isso mesmo, Mauricio,

Acho que o paradigma de programacao Orientado a Atores esta mais preparado para o "mundo paralelo" que estaremos vivenciando nas próximas geracoes de computadores.

Em meu grupo de pesquisa trabalhamos com desenvolvimento Orientado a Atores e ele tem se mostrado muito eficiente, principalmente no que diz respeito a clareza na especificação de comportamentos paralelos.

A saida é nos prepararmos e aguardar o que vem por ai.

Luciano Henrique disse...

Olá Alisson,

Acredito assim como você que esse paradigma está em modificação. Tenho um aluno orientando que fez um trabalho com Erlang (ESTUDO ARQUITETURAL DE CLOUD COMPUTING UTILIZANDO ERLANG).
A proposta é encaminhar para um projeto de pós. Vou te encaminhar o artigo resumo.
Um abraço.

Anônimo disse...

Muito bom o texto... Acredito na plantação de uma nova restruturação dos computadores, para colhermos excelentes tecnologias e resultados.