Pergunta

Estou tentando otimizar o tempo de compilação de um grande projeto VC++.Meu processador é um Core i7 950 (4 núcleos, 8 threads, pois suporta a tecnologia Intel Hyper-Threading).

No Microsoft Visual Studio 2010, se você for para Ferramentas>Opções>Projetos e Soluções>Configurações do projeto VC++>Máximo de complilações simultâneas de C++

você pode selecionar o máximo de núcleos de CPU a serem usados ​​para compilação paralela de C++.Eu seleciono 0 lá (para que todos os meus núcleos sejam usados), o que produz exatamente os mesmos resultados de quando uso 4 ou 8.

Agora, se eu abrir o Gerenciador de Tarefas durante a compilação do projeto, posso ver que 4 threads de compilação paralela estão em execução (em processos eles têm a descrição:Driver do compilador Microsoft C/C++) e que o uso total da CPU é um pouco menor que 50% o tempo todo.

Então minha pergunta é:

É possível ter 8 threads de compilação paralelos em um processador quad core hiper-threaded?Se isso não for possível, é possível usar de alguma forma perto de 100% da potência do processador durante a compilação?

Isso vai me poupar muito tempo.

Muito obrigado antecipadamente,

Nicolau

Foi útil?

Solução

Isso vai me poupar muito tempo.

Não, não seria.Hyperthreading é útil quando você tem diferentes tipos de tarefas para executar que utilizam recursos complementares dentro da CPU.Por exemplo, um thread usa muito ponto flutuante e o outro não.Enquanto o primeiro faz matemática de ponto flutuante, o restante da CPU fica disponível para o outro thread.

Por razões óbvias, vários threads de compilação desejam os mesmos recursos internos da CPU.Tudo o que você conseguiria é ter o dobro de threads lutando pelo cache e pelos recursos da CPU.Mais contenção de cache tornaria a vida mais lenta, e não mais rápida.


Bem, o que foi dito acima explica por que você não obterá GRANDES ganhos com Hyperthreading e código homogêneo.A sabedoria convencional para criação paralela é definir o número de trabalhos um a mais que o número de núcleos, supondo que processos 1/N provavelmente estejam realizando E/S de disco.Claro, isso é para Unix make, onde um trabalho faz muito processamento de makefile além da compilação real.

Se você girou o botão para 8 e não viu nenhuma alteração (observe que pode ser uma alteração negativa no rendimento pelos motivos explicados acima) no uso de CPU relatado pelo Gerenciador de Tarefas, provavelmente é porque as interdependências em sua solução estão forçando certas tarefas de compilação para executar sequencialmente.Se uma tarefa depende da saída de outra (cabeçalhos pré-compilados geralmente causam isso), isso limita o número de trabalhos simultâneos - mesmo se você tivesse um sistema de 16 núcleos, ainda não obteria mais paralelismo do que a estrutura do projeto permite.

Outras dicas

Pode ser que você esteja apenas limitado por disco em vez de limitado por CPU.

Acho que isso é um problema com o visual studio.Tente executar seus makefiles com "jom", o clone paralelo do nmake.Você deverá ver um aumento de 35% ao usá-lo em relação ao msvc chamado para compilar com 4 núcleos.

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