Aqui está uma pequena ilustração da minha pergunta:
Suponha um trabalho de construção que consiste em 4 tarefas independentes denominadas AD. D leva mais tempo que a CA, em suma.
Um sistema de construção que não pode incorporar os tempos relativos das tarefas pode agendar as tarefas da seguinte maneira:
---------------------------------------
CPU1: A | C |
---------------------------------------
CPU2: B | D |
---------------------------------------
Por outro lado, se o planejador estiver ciente das diferenças de tempo da tarefa, poderá criar um cronograma muito mais curto:
---------------------------------------
CPU1: A | B | C |
---------------------------------------
CPU2: D |
---------------------------------------
Minhas perguntas:
- Existem sistemas de construção que incorporam tempos de tarefa relativos esperados no planejamento?
- Que pesquisa acadêmica sobre sistemas de construção desse tipo existe?
- De onde esses sistemas de construção (se eles existem) tiram as informações de tempo? Heurísticas, tempos coletados durante as compilações anteriores?
- Se tais sistemas de construção não existem, por quê? Existe uma pegadinha que os tornaria menos dignos do que parecem à primeira vista?
scheduling
research
build-system
sjakobi
fonte
fonte
Respostas:
O Microsoft Visual Studio Team System (anteriormente TFS) considera tempos de ação de compilação e compilações paralelas; pega os dados do histórico de compilação anterior; e, embora eu não acredite que você consiga obter o comportamento desejado imediatamente, poderá personalizá-lo.
Um exemplo de algumas tarefas personalizadas para otimizar o desempenho
https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/
fonte
Isso se baseia na suposição errada de que "construir" uma tarefa não é paralelo.
Muitos compiladores trabalham com vários threads, portanto, uma única tarefa A usará todas as CPUs. Portanto, o pedido não importa. Para tarefas vinculadas de E / S, especialmente envolvendo redes, é melhor iniciá-las todas paralelamente desde o início: será gasto mais tempo aguardando uma resposta.
Em outras palavras, a ordenação não importa, pois as tarefas individuais geralmente são paralelizadas (como compilar, por exemplo)
Editar:
Na verdade, essa concepção de "Tarefa A na CPU 1" também é falha. Mesmo para tarefas de encadeamento único, o SO que agende os processos / encadeamentos pode saltar de CPU para CPU em cada opção de contexto. Eu acho que a maioria dos sistemas de compilação executará todas as tarefas em paralelo e permitirá que o SO faça o agendamento. Tarefas mais longas levarão mais tempo e é isso.
Supondo que você tenha uma tarefa encadeada única de longa execução que não esteja vinculada a E / S , seria muito mais fácil para o sistema de construção atribuir uma prioridade / importância a ele, ao invés de tentar atrasar tarefas menores para reduzir as alternâncias de contexto do sistema operacional.
Mesmo que você tenha tarefas tão estranhas , o que é bastante raro na prática, e tenha um sistema sofisticado de criação de agendamento que funcione com heurísticas com base em execuções anteriores (a única maneira de saber), os benefícios que você obtém dela podem ser bastante pequenos. de qualquer forma, você obtém um monte de complexidade adicional para manter.
fonte
make -j
) pode iniciar vários processos de compilação em paralelo.-j <nb-cores>
mas infelizmente o padrão ainda é "1" ... Ainda estou surpreso por nunca ter mudado.