Diz-se que a era dos ganhos acelerados no clock dos processadores acabou, e que a tendência para o futuro próximo é a adição de novos núcleos, com processadores com 2 ou 4 núcleos, como hoje, e mais para o futuro. Diz-se também que isso implica em uma nova geração de programas, capaz de tirar maior proveito da arquitetura com dois ou mais núcleos. Eu suspeito que isso tem a haver com programação concorrente, mas não tenho noções sobre isso, por isso queria que alguém mais inteirado no assunto me ajudasse. A questão, colocada de modo mais simples, é: a JVM pode tirar partido da arquitetura em vários núcleos?
Minha questão se divide em duas partes. A primeira é a seguinte: supondo um programa em Java, que rode num computador com processador A, que tem apenas um núcleo. Se eu passar esse programa para outro computador, com processador A2, haverá um ganho de desempenho? Suponha que A2 é um chip que junta dois processadores A - iguais em tudo ao que eu usava antes - só que colocados juntos. Nesse caso, haveria um ganho de desempenho? Outra questão relacionada: esse ganho de desempenho, se houver, tem algo a haver com o uso que a JVM faz de concorrência (threads, etc.)?
A segunda questão é a seguinte: para tirar maior partido da nova arquitetura, é desejáve que o programador tenha mais noções de concorrência? O expediente de “partir” o programa entre threads e processos pode ajudar a tirar partido da nova arquitetura, principalmente no caso de programas mais pesados, que lidam com gráficos e com som? Isso, de alguma forma, é MAIS importante agora do que era antes?
Agradeceria a ajuda de quem puder me responder.
Obrigado,
Hel_all
Arquitetura Dual Core, concorrência e Java
5 Respostas
ola amigo,
tambem compartilho varias dessas duvidas. Sem a menor duvida, qdo
o programador tem conhecimento suficiente pra saber quais partes da app paralelizar, o resultado é melhor.
qdo a JVM, nao faço ideia de quao bem ela tira proveito da paralelizacao dos processadores.
pelo o q eu estudei, ainda é um problema mto, mas mto grande otimizar a execucao de um programa
atraves de paralelismo, haja visto q é mto dificil
decidir quais instrucoes de um programa podem ou nao ser
executadas em paralelo.
quem souber + e puder colaborar,
abraços
Certamente.
Sim. Os ganhos serão mais significativos em programas com multiplas threads, mas, mesmo num programa single thread, haverá ganho de desempenho. Em primeiro lugar, a JVM tem threads separadas (como a de garbage collection), que se beneficia da arquitetura. Agora, um programa Single Threaded, feito em C++, não terá ganho de desempenho, embora o usuário ainda tenha ganho. Se o programa executar um processamento pesado, somente um dos núcleos travarão, permitindo ao usuário matar a aplicação sem o congelamento ou grande lentidão do sistema de janelas.
A arquitetura em vários núcleos não “quebra” um bloco de processamento, como um ciclo de pipeline faria. Pipelinning já é usado nos processadores ha muito tempo. Esse bloco já deve ser quebrado, na forma de múltiplas threads.
Sim, é importante que o programador divida o programa em múltiplas threads. Conhecer mais de concorrência? Tenho minhas dúvidas. Você pode separar os programas em várias threads usando classes prontas do Java, como SwingWorker ou FutureTask, que encapsularão a concorrência para você. Além disso, nada impede você de usar threads com pouco relacionamento entre si, através de filas de mensagens, que exigem pouco conhecimento em concorrência. Aliás, também já existem tais filas thread-safe em java.
De qualquer forma, já era muito importante conhecer sobre concorrência, mesmo antes dos processadores com múltiplos núcleos. Por exemplo, para garantir o funcionamento do Swing e uma interface mais responsiva, era melhor e mais recomendado deixar por conta do time-sharing do processador em múltiplas threads, do que tentar implementar o seu próprio algoritmo que evita starvation numa thread só. O que muda agora, com múltiplos núcleos, é:
- A ordem de execução das threads, que já não era garantida, agora é mais caótica ainda;
- Por conta do #1, os problemas de threads ficam mais aparentes;
- Parte do que seria feito em time-sharing, será realmente feito em vários processadores, havendo ganho de desempenho.
Amigos,
Queria agradecer as respostas, que realemnte foram muito esclarecedoras.
Obrigado,
Hel_all
Olá
Vou tentar responder a sua pergunta que é muito difícil porque velho como sou, tenho a maor dificuldade de ler textos assim sem pular linhas entre parágrafos
Sim, como o Vinicius já respondeu.
Impossível responder sem saber nada do seu programa, pode ser que haja ganho de desempenho e pode ser que ele seja imperceptível
Não é assim que são os multicores porque o clock é menor do que o processador único e há muitas outras coisas em jogo como cache por exemplo
Não de forma que se possa perceber. Se houver ganho será porque você desenvolveu seu sistema para isto.
Segunda? Acho que eu estou confuso mesmo!
Sim, é fundamental. E o Java 7 trará mais facilidades nesta área, isto é, novas coisas para se estudar.
Talvez, se o sistema precisar disto a resposta é sim, Se a divisão for imaginando que a JVM vai dividir automaticamente as threads em vários processadores a resposta pode ser não porque há também um custo associado na criação de threads
Sim, mas como enfatizei antes: somente para sistemas que precisam disto.
Ah, e não espere ganhos em sistemas cujo processamento tem lógica linear, isto é, não fazem coisas em paralelo. Por exemplo: para obter ganhos na solução de um sistema de equações ou em uma ordenação grande, será preciso mudar os algoritmos anteriormente usados com um único processador.
[]s
Luca
Mas considere também os ganhos de maneira mais macroscópica, e não só num processo isolado.
Um dos ganhos consideráveis que temos observado aqui, mesmo em sistemas de processamento linear, está na maior disponibilidade do núcleo para o processamento. Não é que o algoritmo ficará mais rápido, mas haverá menos trocas de processos, o que torna o processamento mais direto e, portanto, mais rápido. Ou seja, o processamento ficará mais intenso.
A diferença é bastante perceptível, mesmo para o usuário final. Hoje existem muitos processos em “segundo plano” (o anti-vírus e o messenger, por exemplo). E esses processos passam a interferir muito menos num processamento pesado.
Só um comentário. Num futuro próximo, fala-se da spintrônica como alternativa à eletrônica, o que eliminaria em grande parte as limitações físicas de hoje e permitiria processadores muito mais rápidos.