Pergunta

Eu estou trabalhando em um projeto foram precisamos de mais desempenho.Ao longo do tempo temos continuado a evoluir o design para trabalhar mais em paralelo(rosca e distribuída).Em seguida, mais recente passo foi a mover-se parte de uma nova máquina com 16 núcleos.Eu estou achando que precisamos repensar a forma como fazemos as coisas à escala, para que muitos núcleos em um modelo de memória compartilhada.Por exemplo, o padrão de alocador de memória não é boa o suficiente.

Que recursos seriam pessoas recomendam?

Até agora eu encontrei Sutter coluna do Dr.Dobbs para ser um bom começo.Eu só tenho A Arte de Multiprocessador de Programação, e A O'Reilly livro sobre Intel Threading Building Blocks

Foi útil?

Solução

Um par de outros livros que vão ser úteis são:

Considere, também, confiar menos no estado de partilha entre processos concorrentes.Você vai escala muito, muito melhor, se você pode evitá-lo, porque você vai ser capaz de parcelas unidades independentes de trabalho, sem ter para fazer a sincronização entre eles.

Mesmo se você precisa compartilhar algumas de estado, veja se você pode particionar o estado compartilhado a partir do processamento real.Que vai deixar você fazer o máximo de processamento em paralelo, de forma independente, a partir da integração das unidades concluídas de trabalho para o estado compartilhado.Obviamente, isso não funciona se você tiver dependências entre as unidades de trabalho, mas vale a pena investigar em vez de apenas partindo do princípio de que o estado é sempre vai ser compartilhado.

Outras dicas

Você pode querer verificar para fora Google Ferramentas de Desempenho.Eles já lançaram a sua versão do malloc eles usam para aplicações multithread.Ele também inclui um bom conjunto de ferramentas de criação de perfil.

Jeffrey Richter é para enfiar um monte.Ele tem alguns capítulos sobre threads em seus livros e confira seu blog:

http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx.

Como monty python diria: "e agora para algo completamente diferente" - você poderia tentar uma linguagem/ambiente que não usam threads, mas os processos e mensagens (não compartilhado estado).Uma das mais maduras é erlang (e esta excelente e divertido livro: http://www.pragprog.com/titles/jaerlang/programming-erlang).Pode não ser exatamente relevantes para as suas circunstâncias, mas você ainda pode aprender um monte de idéias que você pode ser capaz de aplicar em outras ferramentas.

Para outros ambientes:

.Net F# (para aprender programação funcional).JVM tem Scala (que tem atores, muito parecido com Erlang, e é funcional língua híbrida).Há, também, o "garfo" ingressar em quadro de Doug Lea para Java, que faz um monte de trabalho duro para você.

O alocador no FreeBSD recentemente recebeu uma atualização para o FreeBSD 7.O novo é chamado de jemaloc e é, aparentemente, muito mais escalável com respeito aos vários segmentos.

Você não mencionou qual plataforma você está usando, então talvez esta atribuição está disponível para você.(Eu acredito O Firefox 3 usa jemalloc, mesmo no windows.Então, as portas devem existir em algum lugar.)

Dê uma olhada no Tesouro se você está fazendo um monte de alocação de memória.

Rolo de seu próprio Bloqueio De Lista Livre.Um bom recurso é aqui - é em C#, mas as idéias são portáteis.Uma vez que você pegar o jeito de como eles trabalham de você começar a ver outros lugares onde eles podem ser usados e não apenas em listas.

Vou ter de check-out Tesouro, o Google Perftools e jemalloc em algum momento.Por enquanto estamos usando scalable_malloc da Intel Threading Building Blocks e realiza bem o suficiente.

Para o melhor ou para o pior, nós estamos usando C++ no Windows, apesar de grande parte de nosso código irá compilar com o gcc apenas multa.A menos que haja uma razão convincente para mover para redhat (o principal distro linux usamos), eu duvido que vale a pena a dor de cabeça/política dificuldade para se mover.

Eu gostaria de usar Erlang, mas não há maneira muito aqui para refazê-lo agora.Se pensarmos sobre os requisitos para o desenvolvimento de Erlang em uma de telecomunicações definição, são muito semelhantes ao nosso mundo (sistema eletrônico de negociação).Armstrong livro está na minha pilha de leitura :)

No meu teste para dimensionar a partir de 4 núcleos de 16 núcleos aprendi a apreciar o custo de qualquer bloqueio/contenção em paralelo parte do código.Felizmente, temos uma grande parcela de que as escalas com os dados, mas mesmo que não funcionou devido a um bloqueio extra e o alocador de memória.

Manter uma simultaneidade link do blog que pode ser de interesse contínuo:

http://concurrency.tumblr.com

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