Eu tenho um Mac Quad Core i7 do início de 2011. Devido ao hyperthreading, muitos programas relatam 8 "núcleos". Se eu escrevesse um programa que fosse executado em paralelo, poderia iniciar 8 instâncias desse programa ou apenas 4?
Posso iniciar quantos threads quiser, mas veria 4 ou 8 instâncias do programa sendo executadas em paralelo?
Responder1
O processador Intel Core i7 possui 4 núcleos físicos, mas cada núcleo tem a capacidade de inserir até 2 Threads por vez, mostrando um total de 8 Threads para o sistema operacional na forma de "CPUs lógicas disponíveis".
Na realidade, um único núcleo pode lidar apenas com um thread por vez, mas possui mecanismos especiais de enfileiramento/temporização/agendamento para permitir que 2 threads estejam em diferentes estágios do "pipeline" ao mesmo tempo. Isso permite que a CPU termine 2 threads mais cedo do que faria se lidasse apenas com um de cada vez. Como ambos os threads compartilham o mesmo pipeline, o benefício de desempenho obviamente não será 2x. A maioria dos testes avalia o benefício entre 10% e 50%, dependendo do tipo de instruções que estão sendo executadas.
Em resposta à sua pergunta, se você iniciar 4, 8 ou 16 instâncias do seu programa, todas elas estarão "em execução", mas as instruções para cada uma serão enfileiradas dependendo de quantos THREADS disponíveis estiverem disponíveis. Depois que você ultrapassar o número de NÚCLEOS FÍSICOS disponíveis (por exemplo, 5 ou mais), o desempenho será reduzido porque quaisquer threads além da base 4 compartilharão um núcleo físico da CPU.
Finalmente, quando você atingir o limite da capacidade de threading da CPU disponível (exceder 8 threads), o sistema operacional começará a agendar/enfileirar instruções para aguardar até que as do pipeline sejam concluídas. O ideal é evitar ultrapassar os threads disponíveis, pois isso pode ter impactos negativos no desempenho e gargalar o sistema.