Pergunta

Como um desenvolvedor de software lidar principalmente com linguagens de programação de alto nível Eu não tenho certeza do que eu posso fazer para apropriadamente prestar atenção para a próxima omni-presença de vários núcleos computadores. I escrever aplicações na sua maioria comuns e não exigindo, no entanto, eu acho que é importante saber se eu precisar alterar quaisquer paradigmas de programação ou linguagem, mesmo a dominar o futuro.

A minha pergunta, portanto:
How to deal with increasing multicore presence in day-by-day hacking?

Foi útil?

Outras dicas

A maioria dos problemas não exigem uma grande quantidade de tempo de CPU. Realmente, núcleos individuais são bastante rápido o suficiente para muitos propósitos. Quando você encontrar o seu programa é muito lento, primeiro perfil dele e olhar para a sua escolha de algoritmos, arquitetura e caching. Se isso não levá-lo o suficiente, tente dividir o problema acima em processos separados. Muitas vezes isso vale a pena fazer simplesmente para isolamento de falhas e para que você possa entender o uso de CPU e memória de cada processo. Além disso, normalmente cada processo será executado em um núcleo específico e fazer bom uso dos caches do processador, então você não terá que sofrer a sobrecarga de desempenho substancial de manter linhas de cache consistente. Se você vai para um design multi processo e ainda encontrar problema precisa de mais tempo de CPU do que você ganha com a máquina que você tem, você está bem posicionado para estendê-lo correr ao longo de um cluster.

Há situações onde você precisa de vários segmentos dentro do mesmo espaço de endereço, mas cuidado que tópicos são realmente difíceis de acertar. condições de corrida, especialmente em idiomas não-seguros, por vezes, levam semanas para depuração; muitas vezes, a simples adição de rastreamento ou correr sob um depurador irá mudar os horários suficientes para esconder o problema. Basta colocar bloqueios em todos os lugares, muitas vezes significa que você terá um monte de sobrecarga de bloqueio e às vezes muito contenção de bloqueio que você realmente não obter a vantagem de concorrência que você estava esperando. Mesmo quando você tem o direito de bloqueio, então você precisa perfil para sintonizar para a coerência de cache. Finalmente, se você quiser realmente sintonia algum código altamente concorrente, você provavelmente vai acabar olhando para construções livre de bloqueio e sistemas de bloqueio mais complexos do que aqueles em bibliotecas multi-threading atuais.

Saiba os benefícios da concorrência e os limites (por exemplo, lei de Amdahl).

Assim que puder, sempre que possível, explorar a única rota para maior desempenho que vai ser aberto. Há um monte de trabalho inovador acontecendo em abordagens mais fáceis (futuros e bibliotecas de tarefas), e o trabalho de idade sendo redescoberto (linguagens funcionais e dados imutáveis).

O almoço grátis é longo, mas isso não significa que não há nada para explorar.

Em geral, tornam-se muito amigável com threading. É um mecanismo terrível para paralelização, mas é o que temos.

Se você fazer o trabalho com .NET, olhada nas extensões paralelas. Eles permitem que você facilmente realizar muitas tarefas de programação paralela.

Para se beneficiar mais do que apenas um núcleo você deve considerar paralelização seu código. Vários segmentos, tipos imutáveis, e um mínimo de sincronização são seus novos amigos.

Eu acho que vai depender de que tipo de aplicativos que você está escrevendo.

Algum tipo de aplicativos beneficiar mais do fato de que eles são executados em uma CPU mutli-core, em seguida, outros. Se o seu aplicativo pode se beneficiar do fato de multi-core, então você deve estar pronto para ir paralelo. O almoço grátis é longo; ou seja: no passado, o aplicativo tornou-se mais rápido quando um novo cpu foi lançado e você não tem que colocar qualquer esforço em seu aplicativo para obter essa velocidade extra. Agora, para tirar partido das capacidades de multi-core ofertas de CPU, você tem que se certificar de que a sua aplicação pode tirar proveito dela. Ou seja: você tem que ver que tarefas podem ser executadas multithreaded / simultaneamente, e isso traz alguns problemas para a mesa ...

Saiba Erlang / F # (dependendo da sua plataforma)

  • Prefere estruturas de dados imutáveis, o seu uso torna o software mais fácil de entender não apenas em programas concorrentes.

  • Saiba as ferramentas para a simultaneidade na sua língua (por exemplo java.util.concurrent, JCIP ).

  • Saiba uma linguagem funcional (por exemplo Haskell ).

Eu tenho feito a mesma pergunta, ea resposta é "depende". Se o seu Joe Winforms, talvez não tanto. Se o seu escrevendo código que deve ser performance, sim. Um dos maiores problemas que eu posso ver com programação paralela é esta: se algo não pode ser parallized, e você mentir e dizer o tempo de execução para fazer em paralelo de qualquer maneira, não vai falhar, ele só vai fazer coisas erradas , e você vai obter resultados porcaria e culpar o quadro.

Saiba OpenMP e MPI para o código C e C ++.

OpenMP também se aplica a outras línguas, bem como Fortran suponho.

Escrever programas menores.

Outras linguagens de código / estilos vai deixar você fazer multithreading melhor (embora multithreading ainda é muito difícil em qualquer língua), mas a grande vantagem para os desenvolvedores regulares, IMHO, é a capacidade de executar muitos programas menores simultaneamente para realizar algumas muito maior tarefa.

Assim, adquirir o hábito de quebrar os seus problemas em componentes independentes que podem ser executados quando quiser.

Você vai construir software mais sustentável também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top