Visual Studio 2010, Máximo de compilações C++ simultâneas para processadores Hyper-Threaded
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
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.