Por que não criar um grande núcleo de CPU? [fechadas]


25

Não entendo por que os fabricantes de CPU fabricam chips com vários núcleos. O dimensionamento de vários núcleos é horrível, isso é altamente específico do aplicativo e tenho certeza de que você pode apontar um determinado programa ou código que funciona muito bem em muitos núcleos, mas na maioria das vezes o dimensionamento é lixo. É um desperdício de espaço de silicone e um desperdício de energia.

Os jogos, por exemplo, quase nunca usam mais de quatro núcleos. Simulações de ciência e engenharia, como Ansys ou Fluent, custam quantos núcleos o PC roda, então você paga mais porque possui mais núcleos, mas o benefício de mais núcleos se torna realmente ruim depois dos 16 núcleos, mas você tem esses 64 núcleos estações de trabalho ... é um desperdício de dinheiro e energia. É melhor comprar um aquecedor de 1500 W para o inverno, muito mais barato.

Por que eles não fazem uma CPU com apenas um grande núcleo?

Eu acho que se eles fizessem o equivalente a um núcleo de uma CPU de oito núcleos, esse núcleo teria um aumento de 800% no IPC, para que você obtivesse o desempenho completo em todos os programas, não apenas naqueles otimizados para vários núcleos. Mais IPC aumentam o desempenho em todos os lugares, é uma maneira confiável e simples de aumentar o desempenho. Múltiplos núcleos aumentam o desempenho apenas em um número limitado de programas e a escala é horrível e não confiável.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo . Todas as conclusões alcançadas devem ser editadas novamente na pergunta e / ou em qualquer resposta.
Dave Tweed

Você pode estar interessado neste artigo: gotw.ca/publications/concurrency-ddj.htm
lvella 14/06

"mas o benefício de mais núcleos se torna realmente ruim após 16 núcleos" Você obviamente não sabe do que está falando. Confie em mim, trabalhei em processos que rodam em algumas dezenas de milhares de CPUs. Existe toda uma classe de problemas chamada "Embaraçosamente paralelizável", em que jogar mais núcleos no problema funciona muito bem.
Aron

Respostas:


93

O problema está no pressuposto de que os fabricantes de CPU podem simplesmente adicionar mais transistores para tornar um único núcleo de CPU mais poderoso, sem conseqüências.

Para fazer uma CPU fazer mais, você precisa planejar o que fazer mais implica. Existem realmente três opções:

  1. Faça o núcleo funcionar com uma frequência de clock mais alta - o problema é que já estamos atingindo as limitações do que podemos fazer.

    O uso de energia e, portanto, a dissipação térmica aumentam com a frequência - se você duplicar a frequência, você nominalmente duplicará a dissipação de energia. Se você aumentar a voltagem, sua dissipação de energia aumentará com o quadrado da voltagem.

    Interconexões e transistores também apresentam atrasos na propagação devido à natureza não ideal do mundo. Você não pode simplesmente aumentar o número de transistores e espera poder rodar na mesma frequência de clock.

    Também estamos limitados por hardware externo - principalmente RAM. Para acelerar a CPU, é necessário aumentar a largura de banda da memória, executando-a mais rapidamente ou aumentando a largura do barramento de dados.


  1. Adicione instruções mais complexas - Em vez de correr mais rápido, podemos adicionar um conjunto de instruções mais rico - tarefas comuns como criptografia etc. podem ser reforçadas no silício. Em vez de usar muitos ciclos de clock para calcular em software, temos aceleração de hardware.

    Isso já está sendo feito nos processadores CISC (Complex Instruction Set). Veja coisas como SSE2, SSE3. Hoje, um único núcleo de CPU é muito mais poderoso do que um núcleo de CPU há 10 anos, mesmo que seja executado na mesma frequência de clock.

    O problema é que, ao adicionar instruções mais complicadas, você adiciona mais complexidade e torna o chip maior. Como resultado direto, a CPU fica mais lenta - as frequências de clock alcançáveis ​​caem à medida que os atrasos na propagação aumentam.

    Essas instruções complexas também não ajudam em tarefas simples. Você não pode proteger todos os casos de uso possíveis; assim, inevitavelmente, grandes partes do software que você está executando não se beneficiarão de novas instruções e, de fato, serão prejudicadas pela resultante redução da taxa de clock.

    Você também pode aumentar a largura do barramento de dados para processar mais dados de uma só vez; no entanto, novamente isso aumenta a CPU e você encontra uma troca entre a taxa de transferência obtida através de barramentos de dados maiores e a queda na taxa de clock. Se você possui apenas dados pequenos (por exemplo, números inteiros de 32 bits), ter uma CPU de 256 bits não ajuda muito.


  1. Torne a CPU mais paralela - em vez de tentar fazer uma coisa mais rapidamente, faça várias coisas ao mesmo tempo. Se a tarefa que você está realizando se presta a operar várias coisas ao mesmo tempo, você quer uma única CPU que possa executar vários cálculos por instrução (SIMD) ou ter várias CPUs que podem executar uma Cálculo.

    Este é um dos principais drivers para CPUs com vários núcleos. Se você tem vários programas em execução ou pode dividir seu único programa em várias tarefas, ter vários núcleos de CPU permite fazer mais coisas ao mesmo tempo.

    Como os núcleos individuais da CPU são efetivamente blocos separados (exceto caches e interfaces de memória), cada núcleo individual é menor que o único núcleo monolítico equivalente. Como o núcleo é mais compacto, os atrasos na propagação são reduzidos e você pode executar cada núcleo mais rapidamente.

    A questão de saber se um único programa pode se beneficiar de ter vários núcleos, depende inteiramente do que esse programa está fazendo e como foi escrito.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo . Todas as conclusões alcançadas devem ser editadas novamente na pergunta e / ou em qualquer resposta.
Dave Tweed

Um dos pontos levantados nos comentários que ainda não foram abordados é que as CPUs podem ser paralelas executando várias instruções por relógio (Superscalar). Isso é ortogonal ao SIMD e à frequência; instruções por relógio (IPC) é o terceiro fator na taxa de transferência real por tempo. Todas as CPUs modernas para cargas de trabalho de uso interativo têm pelo menos 2 de largura.
Peter Cordes


37

Além das outras respostas, há outro elemento: o rendimento do chip . Um processador moderno possui vários bilhões de transistores, cada um desses transistores precisa funcionar perfeitamente para que todo o chip funcione corretamente.

Ao criar processadores com vários núcleos, você pode particionar de maneira limpa grupos de transistores. Se houver um defeito em um dos núcleos, você poderá desativá-lo e vender o chip por um preço reduzido, de acordo com o número de núcleos em funcionamento. Da mesma forma, você também pode montar sistemas a partir de componentes validados como em um sistema SMP.

Para praticamente todos os CPUs que você compra, a vida começou a ser um modelo premium de ponta para essa linha de processadores. O resultado final depende de quais partes do chip estão funcionando incorretamente e estão desabilitadas. A Intel não fabrica processadores i3: todos estão com defeito no i7, com todos os recursos que separam as linhas de produtos desativados porque falharam no teste. No entanto, as partes que ainda estão funcionando ainda são úteis e podem ser vendidas por muito mais barato. Qualquer coisa pior se torna bugigangas de chaveiro.

E defeitos não são incomuns. Criar perfeitamente esses bilhões de transistores não é uma tarefa fácil. Se você não tiver oportunidades de usar seletivamente partes de um determinado chip, o preço do resultado aumentará rapidamente.

Com apenas um único processador über, a fabricação é tudo ou nada, resultando em um processo muito mais dispendioso. Para alguns dispositivos, como sensores de imagem para fins científicos ou militares, nos quais você precisa de um sensor enorme e tudo tem que funcionar, os custos desses dispositivos são tão grandes que apenas os orçamentos em nível estadual podem pagar.


4
Se / quando os rendimentos melhoram e estão produzindo chips mais funcionais do que o mercado exige, os fornecedores geralmente começam a fundir alguns dos núcleos / cache e / ou separá-los com um SKU de frequência mais baixa, em vez de ajustar a estrutura de preços para obter os preços mais altos. chips finais relativamente mais baratos. Com as GPUs / placas gráficas, você costumava desbloquear unidades shader desativadas em algumas placas com um hack de firmware, para ver se você teve sorte e conseguiu uma placa onde elas estavam desativadas apenas para segmentação de mercado, não defeitos reais.
Peter Cordes

4
A Intel fabricou matrizes de núcleo duplo para alguns de seus chips. Com todos os seus SKUs móveis ULV (voltagem ultrabaixa) sendo de núcleo duplo, não havia quatro núcleos com defeito suficientes e a área de matriz menor (especialmente com um iGPU de corte também) fornece mais chips de núcleo duplo por wafer do que fundir matrizes quad-core. en.wikichip.org/wiki/intel/microarchitectures/… possui moldes de matriz de Sandybridge gráficos de núcleo duplo + GT1 de 131 mm², em comparação com gráficos de núcleo duplo + GT2 de 149 mm² e gráficos de GT2 + núcleo de 149 mm² de quad + GT2 de 216 mm². Ainda há espaço para defeitos no cache, etc.
Peter Cordes

E (alguns) defeitos em parte de uma unidade FMA presumivelmente podem ser tratados fundindo-a e vendendo-a como um chip Celeron ou Pentium (sem AVX, portanto, apenas vetores de 128 bits). Até mesmo os modernos chips Skylake ou Coffee Lake Pentium não possuem o AVX . As unidades SIMD FMA compõem uma fração decente de um núcleo (e executam muitas operações SIMD que não a matemática FP, incluindo mul inteiro e deslocamento inteiro), então não ficaria surpreso se as unidades FMA 2x de 256 bits puderem ser mapeadas para 2x 128 bits usando os 2 pedaços ainda estão funcionando. Com o Skylake Xeon, existem até SKUs com taxa de transferência reduzida de AVX512 FMA (apenas 1 trabalhando em FMA de 512 bits)
Peter Cordes

@PeterCordes Se os rendimentos forem tão bons, os fornecedores apresentarão projetos de maior densidade e / ou taxa de clock mais rápida (e, portanto, maior taxa de defeitos) até que as taxas de defeitos voltem ao ponto em que podem desativar os núcleos e / ou reduzir a freqüência dos chips para vender com desconto ..
Monty Harder

@MontyHarder: Isso é verdade, mas a validação custa dinheiro e tempo, e as linhas de produção existentes continuarão fazendo os projetos existentes por um tempo. Mas sim, alguns exemplos da Intel sobre o que você está falando são o Haswell Refresh e vários refinamentos do Skylake com basicamente nenhuma alteração na arquitetura e pequenas melhorias no processo de 14nm. (Às vezes com o novo iGPU). por exemplo, Kaby Lake, em seguida, Coffee Lake etc., como etapas de "otimização" na cadência normal da Intel.
Peter Cordes

26

Dependência de dados

É bastante fácil adicionar mais instruções por relógio, tornando o chip "mais amplo" - essa foi a abordagem "SIMD". O problema é que isso não ajuda na maioria dos casos de uso.

Existem aproximadamente dois tipos de carga de trabalho, independentes e dependentes. Um exemplo de carga de trabalho independente pode ser "com duas seqüências de números A1, A2, A3 ... e B1, B2, ... etc, calcular (A1 + B1) e (A2 + B2) etc." Esse tipo de carga de trabalho é visto em computação gráfica, processamento de áudio, aprendizado de máquina e assim por diante. Muito disso foi atribuído às GPUs, projetadas especialmente para lidar com isso.

Uma carga de trabalho dependente pode ser "Dado A, adicione 5 a ele e procure-o em uma tabela. Pegue o resultado e adicione 16 a ele. Pesquise-o em uma tabela diferente".

A vantagem da carga de trabalho independente é que ela pode ser dividida em várias partes diferentes, para que mais transistores ajudem nisso. Para cargas de trabalho dependentes, isso não ajuda em nada - mais transistores podem apenas torná-lo mais lento . Se você precisa obter um valor da memória, isso é um desastre para a velocidade. Um sinal deve ser enviado através da placa-mãe, viajando abaixo da velocidade da luz, a DRAM precisa carregar uma fila e aguardar o resultado, depois enviá-lo de volta. Isso leva dezenas de nanossegundos. Depois de fazer um cálculo simples, você deve enviar para o próximo.

Gerenciamento de energia

Núcleos de reposição são desativados na maioria das vezes. De fato, em muitos processadores, você não pode executar todos os núcleos o tempo todo sem que a coisa pegue fogo, então o sistema os desativará ou fará o downclock deles para você.

Reescrever o software é o único caminho a seguir

O hardware não pode converter automaticamente cargas de trabalho dependentes em cargas de trabalho independentes. Nem software. Mas um programador que está preparado para redesenhar seu sistema para tirar proveito de muitos núcleos pode.


2
Citação necessária para "não é possível executar todos os núcleos ao mesmo tempo". A menos que você considere a velocidade máxima do clock turbo de núcleo único como a velocidade "real" da CPU. No sentido clássico (antes de atingirmos a parede de energia e a velocidade do relógio era limitada por atrasos críticos na propagação do caminho), sim, é verdade, mas no mundo moderno faz mais sentido olhar para a velocidade do relógio da linha de base como o que pode ser sustentado com todos núcleos ativos executando cargas de trabalho pesadas. Qualquer coisa maior que isso é molho, você pode usar oportunisticamente, conforme os limites de potência / temperatura permitirem. (por exemplo, Turbo da Intel).
Peter Cordes

11
Mas em termos de energia, mesmo o clock máximo de um único núcleo é limitado por térmicas mais do que atrasos de propagação (embora provavelmente os limites do estágio do pipeline sejam selecionados, você estará próximo desse limite no alvo máximo turbo). E a tensão também é uma variável: pior potência, mas menores atrasos no gate. De qualquer forma, não faz sentido considerar o max turbo de núcleo único como algo em que "deveria" ser capaz de executar todos os núcleos, porque esse limite já vem do poder.
Peter Cordes

O contexto da pergunta original estava definitivamente perguntando sobre a velocidade máxima de núcleo único e, para muitos propósitos práticos, que (e seu cache falha) são o verdadeiro fator limitante da velocidade percebida para o usuário.
pjc50 13/06

Sim, todos nós teríamos desempenho 8x de thread único em vez de uma CPU de 8 núcleos, se pudéssemos. (Com o SMT para permitir que ele execute cargas de trabalho separadas naturalmente sem sobrecarga de alternância de contexto. Veja minha resposta. :) Um núcleo super amplo hipotético provavelmente seria capaz de se auto-sincronizar mais rapidamente quando a carga de trabalho causasse muitas paradas, em vez de manter tudo os transistores nas unidades SIMD FMA ligavam e alternavam a cada relógio. (A restrição de energia em um único núcleo também é fundamental para não derreter em relógios de ponto; en.wikipedia.org/wiki/Dark_silicon ). Portanto, ter um único núcleo amplo não tornaria isso diferente.
Peter Cordes

Embora você tenha um argumento de que o desempenho de thread único que vemos nas CPUs atuais é melhor do que se estivesse limitado a uma velocidade de clock que eles poderiam suportar em todos os núcleos simultaneamente, mesmo com uma carga de trabalho de pior caso. ou seja, o Turbo é fundamental, especialmente para peças com baixo TDP, como chips de laptop ( por que minha CPU não consegue manter o desempenho máximo em HPC ): geralmente uma grande proporção entre a linha de base e a max turbo, diferente dos chips de desktop de alta potência, mas com baixa contagem de núcleos , por exemplo, o i7-6700k Skylake é baseado em 4GHz, turbo de núcleo único de 4,2GHz (sem overclocking; maior é possível com 95W TDP).
Peter Cordes

20

Voltando no tempo, os processadores não foram capazes de executar tão rápido. Como resultado, se você queria fazer mais processamento, precisava de mais processadores. Isso pode ser com um coprocessador matemático ou simplesmente com mais do mesmo processador. O melhor exemplo disso é o Inmos Transputer dos anos 80, que foi projetado especificamente para processamento massivamente paralelo com vários processadores conectados. Todo o conceito dependia da suposição de que não havia melhor maneira de aumentar o poder de processamento do que adicionar processadores.

O problema é que essa suposição estava (temporariamente) incorreta. Você também pode obter mais poder de processamento fazendo com que um processador faça mais cálculos. A Intel e a AMD encontraram maneiras de aumentar a velocidade do clock cada vez mais e, como você diz, é muito mais fácil manter tudo em um processador. O resultado foi que, até meados dos anos 2000, o rápido processador single-core possuía o mercado. Inmos morreu no início dos anos 90, e toda a sua experiência morreu com eles.

Os bons tempos tiveram que terminar embora. Quando a velocidade do relógio chegou a GHz, realmente não havia margem para ir além. E voltamos a vários núcleos novamente. Se você realmente não pode ficar mais rápido, mais núcleos são a resposta. Como você diz, nem sempre é fácil usar esses núcleos com eficiência. Hoje em dia, estamos muito melhores, mas ainda estamos facilitando o processo como o Transputer.

Claro que também existem outras opções de aprimoramento - você poderia ser mais eficiente. O SIMD e conjuntos de instruções semelhantes realizam mais processamento para o mesmo número de tiques do relógio. O DDR coloca seus dados dentro e fora do processador mais rapidamente. Tudo ajuda. Mas quando se trata de processamento, voltamos aos anos 80 e a vários núcleos novamente.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo . Todas as conclusões alcançadas devem ser editadas novamente na pergunta e / ou em qualquer resposta.
Dave Tweed

20

Boa pergunta, ou pelo menos uma com uma resposta interessante. Parte dessa resposta mostra um mundo em que as CPUs podem ter uma escala eficiente de largura em vez de vários núcleos separados. Modelos de licenciamento / preço seriam diferentes!

O resto explica por que eles não podem. Resumo:

  • O custo de múltiplos núcleos é dimensionado quase linearmente
  • O custo da ampliação do pipeline superescalar de um núcleo é escalonado ~ quadraticamente Isso é possível com força bruta suficiente, até certo ponto. O desempenho de encadeamento único é muito importante para o uso interativo (a latência de ponta a ponta importa, não apenas a taxa de transferência); portanto, as atuais CPUs high-end de núcleo grande pagam esse preço. por exemplo, Skylake (4 de largura), Ryzen (5 ou 6 de largura) e A12 da Apple (7 de largura para os grandes núcleos, 3 de largura para os pequenos núcleos com eficiência energética)
  • O IPC em diminuição grave retorna apenas da ampliação do pipeline para além de 3 ou 4 de largura, mesmo com execução fora de ordem para encontrar o ILP . As falhas de ramificação e de cache são difíceis e ainda paralisam todo o pipeline.
  • Você não mencionou frequência, apenas IPC, mas a frequência de escala também é difícil. Uma frequência mais alta requer uma voltagem mais alta; portanto, a potência é escalonada com a frequência em cubo : ^1diretamente da frequência e ^2da tensão. (A energia armazenada no capacitor é dimensionada com V ^ 2, e a maior parte da energia dinâmica além da corrente de fuga é do bombeamento de carga para as cargas capacitivas dos portões + fios FET.)

    Desempenho = frequência vezes IPC. (Dentro da mesma arquitetura. O SIMD mais amplo permite que você faça o mesmo trabalho com menos instruções e alguns ISAs são mais densos que outros, por exemplo, o MIPS geralmente requer mais instruções para fazer o mesmo trabalho que o x86 ou o AArch64.)

Os custos estão na área da matriz (custo de fabricação) e / ou energia (que indiretamente limita a frequência porque o resfriamento é difícil). Além disso, menor potência e desempenho por Watt é um objetivo em si, especialmente para dispositivos móveis (bateria) e servidores (densidade de energia / custos de refrigeração / custos de eletricidade).

Antes que o multi-core por soquete fosse uma coisa, você tinha sistemas com vários soquetes para casos de uso avançados, nos quais desejava mais taxa de transferência do que era possível com uma única CPU que poderia ser fabricada, portanto esses eram os únicos sistemas SMP. (Servidores, estações de trabalho de última geração).

Se um único núcleo pudesse ser dimensionado com a eficiência que você desejasse, teríamos sistemas com 1 núcleo físico por soquete e SMT (por exemplo, HyperThreading) para permitir que eles atuassem como múltiplos núcleos lógicos. Os desktops / laptops típicos teriam apenas um núcleo físico e não teríamos dificuldade em paralelizar coisas que não são dimensionadas linearmente com mais núcleos. por exemplo, make -j4para aproveitar os servidores com vários soquetes e / ou ocultar a latência de E / S em uma área de trabalho. (Ou talvez ainda tentássemos paralelizar muito se a largura do pipeline fosse dimensionada facilmente, mas o IPC não o fizesse, então tivemos que usar mais encadeamentos SMT.) apresentar SMT para o sistema operacional era muito diferente; portanto, algoritmos de bloqueio paralelo e bloqueio ainda seriam necessários lá.


Donald Knuth disse em uma entrevista de 2008

Eu também poderia expor um pouco a minha infelicidade pessoal com a tendência atual em direção à arquitetura multicore. Para mim, parece mais ou menos que os projetistas de hardware ficaram sem ideias e estão tentando passar a culpa do futuro desaparecimento da Lei de Moore para os criadores de software , dando-nos máquinas que trabalham mais rápido apenas em algumas poucas. principais parâmetros de referência!

Sim, se pudéssemos ter CPUs milagrosas de núcleo único com 8x de taxa de transferência em programas reais , provavelmente ainda as estaríamos usando. Com sistemas de soquete duplo, apenas quando vale a pena pagar muito mais por mais rendimento (não desempenho de thread único).

Múltiplas CPUs reduzem os custos de troca de contexto quando vários programas estão em execução (permitindo que eles funcionem paralelamente, em vez de alternar rapidamente entre eles); multitarefa preventiva interrompendo a maquinaria maciça e fora de ordem que uma CPU exigiria provavelmente machucaria ainda mais do que agora.

Fisicamente, ele seria de núcleo único (para uma hierarquia de cache simples, sem interconexões entre núcleos), mas suportaria SMT (por exemplo, HyperThreading da Intel), para que o software pudesse usá-lo como 8 núcleos lógicos que competem dinamicamente pelos recursos de taxa de transferência. Ou quando apenas 1 thread está em execução / não está parado, ele obtém o benefício completo.

Então, você usaria vários encadeamentos quando isso fosse realmente mais fácil / natural (por exemplo, processos separados sendo executados ao mesmo tempo) ou para problemas facilmente paralelizados com cadeias de dependência que impediriam maximizar o IPC dessa fera.

Infelizmente, porém, é uma ilusão da parte de Knuth que as CPUs com vários núcleos deixem de ser uma coisa neste momento.


Escala de desempenho de thread único

Eu acho que se eles fizessem um equivalente de 1 núcleo de uma CPU de 8 núcleos, esse núcleo teria um aumento de 800% no IPC, para que você obtivesse o desempenho completo em todos os programas, não apenas naqueles otimizados para vários núcleos.

Sim, é verdade. Se fosse possível construir tal CPU , seria muito surpreendente. Mas acho que é literalmente impossível no mesmo processo de fabricação de semicondutores (ou seja, a mesma qualidade / eficiência dos transistores). Certamente não é possível com o mesmo orçamento de energia e área de matriz que uma CPU de 8 núcleos, mesmo que você economize na lógica para colar núcleos e não precise de muito espaço para caches privados por núcleo.

Mesmo que você permita aumentos de frequência (como o critério real é trabalhar por segundo, não funcionar por relógio), tornar a CPU ainda 2x mais rápida seria um grande desafio.

Se fosse possível, em qualquer lugar próximo do mesmo orçamento de energia e área de matriz (assim, o custo de fabricação), construir essa CPU, sim, os fornecedores de CPU já as construiriam dessa maneira.

Consulte Microprocessadores modernos Um guia de 90 minutos!

Especificamente, mais núcleos ou núcleos mais amplos? seção, para obter os antecedentes necessários para entender esta resposta; ele começa simples com o funcionamento de CPUs em pipeline em ordem e, em seguida, superescalar (várias instruções por relógio). Em seguida, explica como atingimos o muro de força por volta da era P4, levando ao fim da escala de frequência fácil, deixando principalmente apenas o IPC e realizando mais trabalho por instrução (por exemplo, SIMD) como o caminho a seguir, mesmo com transistores menores.

A ampliação de um pipeline (máximo de instruções por relógio) geralmente aumenta em custo como largura ao quadrado . Esse custo é medido na área da matriz e / ou energia, para uma verificação de dependência paralela mais ampla (detecção de perigos) e um agendador fora de serviço mais amplo para encontrar instruções prontas para execução. E mais portas de leitura / gravação no arquivo de registro e no cache, se você quiser executar instruções diferentes de nop. Especialmente se você tiver instruções de 3 entradas, como FMA ou add-with-carry (2 registros + sinalizadores).

Também há retornos decrescentes do IPC para ampliar as CPUs ; a maioria das cargas de trabalho possui ILP (Paralelismo no Nível da Instrução) de pequena escala / curto alcance para as CPUs explorarem, portanto, aumentar o núcleo não aumenta o IPC (instruções por relógio) se o IPC já estiver limitado a menos do que a largura do núcleo por cadeias de dependência, falhas de ramificação, falhas de cache ou outras paradas. Claro que você obteria uma aceleração em alguns loops desenrolados com iterações independentes, mas não é isso que a maioria dos códigos passa a maior parte do tempo fazendo. As instruções de comparação / ramificação representam 20% da combinação de instruções no código "típico", IIRC. (Acho que li números de 15 a 25% para vários conjuntos de dados.)

Além disso, uma falta de cache que interrompe todas as instruções dependentes (e tudo quando a capacidade do ROB é atingida) custa mais para uma CPU mais ampla. (O custo de oportunidade de deixar mais unidades de execução ociosas; mais trabalho potencial não está sendo realizado.) Ou um erro de ramificação da mesma forma causa uma bolha.

Para obter 8x o IPC, precisaríamos de pelo menos uma melhoria de 8x na precisão da previsão de ramificação e nas taxas de acerto do cache . Mas as taxas de acerto do cache não se adaptam bem à capacidade do cache além de um certo ponto para a maioria das cargas de trabalho. E a pré-busca de HW é inteligente, mas não pode ser tão inteligente. E com 8x do IPC, os preditores de ramificação precisam produzir 8 vezes mais previsões por ciclo, além de serem mais precisos.


As técnicas atuais para a criação de CPUs de execução fora de ordem só podem encontrar ILP em intervalos curtos . Por exemplo, o tamanho do ROB do Skylake é 224 uops de domínio fundido, o planejador para uops não executados é 97 de domínio não fundido. Consulte Compreendendo o impacto do lfence em um loop com duas longas cadeias de dependência, para aumentar os comprimentos de um caso em que o tamanho do planejador é o fator limitante na extração do ILP de duas longas cadeias de instruções, se elas forem muito longas. E / ou veja esta resposta mais geral e introdutória ).

Portanto, encontrar o ILP entre dois loops longos separados não é algo que podemos fazer com o hardware. A recompilação binária dinâmica para fusão de loop pode ser possível em alguns casos, mas as CPUs difíceis e não algo que realmente podem fazer, a menos que sigam a rota Transmeta Crusoe. (camada de emulação x86 em cima de um ISA interno diferente; nesse caso, VLIW). Porém, os projetos x86 modernos padrão com caches uop e decodificadores poderosos não são fáceis de superar na maioria dos códigos.

E fora do x86, todos os ISAs ainda em uso são relativamente fáceis de decodificar, portanto, não há motivação para a recompilação dinâmica além das otimizações de longa distância. TL: DR: esperar que os compiladores mágicos que podem expor mais ILP ao hardware não funcionou para o Itanium IA-64 e é improvável que funcione para uma CPU super ampla para qualquer ISA existente com um modelo serial de execução.


Se você tinha uma CPU super ampla, definitivamente desejaria que ela suportasse o SMT, para que você possa mantê-lo alimentado com o trabalho a executar executando vários threads de baixo ILP.

Como o Skylake atualmente tem 4 uops de largura (e alcança um IPC real de 2 a 3 uops por relógio, ou ainda mais perto de 4 no código de alto rendimento), uma hipotética CPU 8x mais ampla seria de 32!

Ser capaz de gravar isso de volta em 8 ou 16 CPUs lógicas que compartilham dinamicamente esses recursos de execução seria fantástico: os threads não paralisados ​​obtêm toda a largura de banda do front-end e a taxa de transferência de back-end.

Porém, com 8 núcleos separados, quando um encadeamento é interrompido, não há mais nada para manter as unidades de execução alimentadas; os outros threads não se beneficiam.

A execução geralmente é rápida: ela fica parada aguardando um carregamento incorreto do cache e, assim que chega muitas instruções em paralelo, pode usar esse resultado. Com uma CPU super ampla, essa explosão pode ir mais rápido e pode realmente ajudar com o SMT.


Mas não podemos ter CPUs mágicas super amplas

Portanto, para obter rendimento, precisamos expor o paralelismo ao hardware na forma de paralelismo no nível do encadeamento . Geralmente, os compiladores não são bons em saber quando / como usar threads, exceto em casos simples, como loops muito grandes. (OpenMP ou gcc -ftree-parallelize-loops). Ainda é preciso ter inteligência humana para refazer o código para obter um trabalho útil eficiente em paralelo, porque a comunicação entre threads é cara e a inicialização do thread também.

O TLP é um paralelismo de granulação grossa, diferentemente do ILP de granulação fina em um único encadeamento de execução que o HW pode explorar.


As CPUs voltadas para cargas de trabalho interativas (como Intel / AMD x86 e núcleos de ponta Apple / ARM AArch64) definitivamente contribuem para os retornos decrescentes do escalonamento IPC, porque o desempenho de thread único ainda é tão valioso quando a latência importa, não apenas a taxa de transferência. problemas massivamente paralelos.

Ser capaz de executar 8 cópias de um jogo em paralelo a 15fps cada é muito menos valioso do que ser capaz de executar uma cópia a 45fps. Os fornecedores de CPU sabem disso, e é por isso que as CPUs modernas usam execução fora de ordem, mesmo que custe energia e área de matriz significativas. (Mas as GPUs não o fazem porque sua carga de trabalho já é massivamente paralela).

O hardware Xeon Phi de muitos núcleos da Intel (Knight's Landing / Knight's Mill) é um ponto interessante: execução fora de ordem muito limitada e SMT para manter núcleos de 2 largos alimentados com instruções SIMX AVX512 para processar números. Os núcleos são baseados na arquitetura Silvermont de baixa potência da Intel. (Executor avariado, mas com uma pequena janela de reordenação, muito menor que a família Sandybridge de grande porte. E um pipeline mais estreito.)


BTW, tudo isso é ortogonal ao SIMD. Obter mais trabalho por instrução sempre ajuda, se for possível para o seu problema.


Modelos de preços

Os modelos de preços de software são baseados no cenário atual de hardware.

Os modelos de licenciamento por núcleo tornaram-se mais difundidos (e relevantes até para desktops de soquete único) com o advento de CPUs com vários núcleos. Antes disso, era relevante apenas para servidores e grandes estações de trabalho.

Se o software não precisasse de múltiplos núcleos para rodar na velocidade máxima, não haveria realmente uma maneira de vendê-lo mais barato para pessoas que não estão obtendo tanto benefício porque o executam em uma CPU mais fraca. A menos que talvez o ecossistema de software / hardware tenha desenvolvido controles em "canais SMT" que permitem configurar uma largura máxima de execução para o código em execução nesse núcleo lógico. (Imaginando novamente um mundo em que as CPUs escalam na largura do pipeline em vez de vários núcleos separados.)


2
"a inicialização do thread é cara" - isso não é um fato difícil; é um artefato de sistemas operacionais modernos comuns.
MSalters 13/06

11
@MSalters E, de fato, alguns projetos de pesquisa exploraram o quão impressionante seria abandonar essa abordagem. O mesmo acontece com a "inteligência humana para refazer o código" - existem maneiras de escrever código que são naturalmente mais fáceis de paralelizar, mas que não foram muito populares nas últimas décadas. Onde eles são usados, geralmente você pode ver uma escala horizontal maciça a um custo muito baixo; de fato, a tal ponto que o dimensionamento horizontal está começando a se tornar muito mais barato que o vertical em muitos aplicativos. Significa apenas que você não deve dar aos desenvolvedores a escolha - se as circunstâncias o
exigirem

11

Deixe-me fazer uma analogia:

Se você tem um macaco digitando em uma máquina de escrever e deseja fazer mais digitação, pode dar café ao macaco, lições de digitação e talvez fazer ameaças para que ele funcione mais rápido, mas chega um momento em que o macaco digitando na capacidade máxima.

Portanto, se você quiser digitar mais, precisará obter mais macacos.


Para estender ainda mais a analogia, você precisa de uma máquina de escrever separada para cada macaco (representando o barramento de dados que cada núcleo precisará), de uma maneira de levar bananas a cada macaco e de algo para capturar seus excrementos (análogo à distribuição de energia e calor) dissipação) e você precisa de uma maneira de garantir que os macacos não estejam todos tentando digitar a mesma passagem na Noite de Reis (análoga a dividir corretamente a carga de trabalho entre os processadores). Mas tudo isso é menos trabalhoso para obter mais ganhos do que tentar obter mais digitação de um macaco.


7

Você ressalta que muitos softwares não usam mais que (x) núcleos. Mas isso é inteiramente uma limitação colocada pelos projetistas desse software. Os PCs domésticos com vários núcleos ainda são novos (ish) e o design de software multithread também é mais difícil com APIs e idiomas tradicionais.

O seu PC também não está apenas executando esse 1 programa. Ele está fazendo várias outras coisas que podem ser colocadas em núcleos menos ativos, para que seu software principal não seja interrompido por eles.

Atualmente, não é possível apenas aumentar a velocidade de um único núcleo para corresponder à taxa de transferência de 8 núcleos. Provavelmente, mais velocidade terá que vir da nova arquitetura.

À medida que mais núcleos estão disponíveis e APIs são projetadas com essa suposição, os programadores começarão a usar mais núcleos. Esforços para tornar os projetos multiencadeados mais fáceis de fazer estão em andamento. Se você fizesse essa pergunta em alguns anos, provavelmente estaria dizendo "Meus jogos normalmente usam apenas 32 núcleos, então por que minha CPU possui 256?".


3
A diferença entre 1 e vários núcleos é enorme em termos de tirar proveito do software. A maioria dos algoritmos e programas é serial. por exemplo, Donald Knuth disse que as CPUs com vários núcleos parecem que os projetistas de HW estão " tentando passar a culpa do futuro desaparecimento da Lei de Moore para os criadores de software, dando-nos máquinas que funcionam mais rapidamente apenas em alguns benchmarks importantes! "
Peter Cordes

Infelizmente, ninguém ainda encontrou uma maneira de fazer com que um único núcleo amplo / rápido execute um programa de thread único em qualquer lugar o mais rápido que pudermos para que um código paralelo eficiente seja executado em vários núcleos. Felizmente, porém, os designers de CPU percebem que o desempenho de thread único ainda é crítico e torna cada núcleo individual muito maior e mais poderoso do que seria se eles estivessem buscando uma taxa de transferência pura em problemas paralelos. (Compare um Skylake (4 de largura) ou Ryzen (5 de largura) vs. um núcleo de um Xeon Phi (Knight's Landing / Knight's Mill baseado em Silvermont + AVX512) (2-wide e limited OoO exec)
Peter Cordes

2
De qualquer forma, sim, ter pelo menos 2 núcleos geralmente é útil para um sistema operacional multitarefa, mas multitarefas preventivas em um único núcleo com 4x ou 8x mais rápido que uma CPU atual seria muito bom. Para muitos casos de uso interativos, isso seria muito melhor, se fosse possível criar / com o mesmo orçamento de energia. (O núcleo duplo ajuda a reduzir os custos da troca de contexto quando várias tarefas desejam tempo de CPU.)
Peter Cordes

11
Tudo verdade, mas historicamente multi-core era mais caro. Não havia muitas razões para projetar algoritmos paralelos fora dos aplicativos científicos. Há muito espaço para paralelização, mesmo em algoritmos que exigem uma execução principalmente serial. Mas o IPC da geração atual não é ótimo e é fácil de bagunçar. O que geralmente resulta em erros realmente difíceis de encontrar e corrigir. É claro que uma CPU 4x mais rápida seria incrível (mas você ainda desejaria vários núcleos).
hekete 13/06

2
@ PeterCordes Bem, a maioria dos algoritmos e programas não são seriados porque precisam ser, mas principalmente porque é assim que sempre é feito (com uma pitada de "foi uma boa troca"). Os casos mais flagrantes são onde você pode executar o mesmo programa quatro vezes em quatro cargas de trabalho separadas e executá-los em paralelo sem problemas. Mas isso atinge outro problema - a CPU não é um gargalo com tanta frequência, e geralmente o caminho é usar algoritmos melhores, não mais CPUs. Às vezes, esses problemas também ajudam com outros gargalos (memória, disco, rede ...).
Luaan 13/06

3

A razão mais convincente do ponto de vista histórico é a dissipação de energia .

Após o Pentium IV, a Intel tentou buscar um processador de próxima geração, codinome Tejas, que deveria rodar na faixa de 4 GHz a 12 GHz. O problema era que correr nessa velocidade gerava muito calor para ser viável.

Após o cancelamento de Tejas, a Intel levou outros 10 a 15 anos para finalmente terem núcleos rodando a 4 GHz com níveis aceitáveis ​​de calor.

Veja Tejas e Jayhawk .

A Intel tinha outro projeto em paralelo com Tejas, que envolvia o uso de múltiplos núcleos. Esse projeto tinha níveis aceitáveis ​​de calor, então foi assim que eles foram. Isso lhes permitiu aumentar o desempenho agora, em vez de esperar outros 10 anos pelos processos de fabricação de 10 nm.

Supondo que os núcleos não estejam com falta de recursos, para obter o mesmo número de instruções por segundo de um único núcleo em vez de N núcleos, você precisaria que a taxa de instruções desse núcleo único fosse N vezes mais rápida. A dissipação dinâmica de energia de um núcleo de CPU é linearmente proporcional à frequência de operação. Também é proporcional ao quadrado da tensão operacional. A operação em frequências mais baixas permite o uso de tensões operacionais mais baixas. O uso de tensões mais baixas em frequências mais baixas significa que, na prática, o calor gerado diminui com o cubo da frequência de operação.

Um exemplo extremo disso é o cérebro humano, que pode executar o equivalente a 2 ^ 18 operações por segundo usando apenas 20 W de potência. Consegue isso usando bilhões de neurônios funcionando paralelamente a apenas algumas centenas de Hz.

Lembre-se também de que geralmente existem centenas ou milhares de threads em execução ao mesmo tempo em um PC. O sistema operacional trata da alocação de tempo em um núcleo para cada encadeamento. Portanto, mesmo que um programa individual não aproveite todos os núcleos, ele ainda será beneficiado porque os outros programas estão gastando menos tempo com a CPU se executados em outro núcleo.

De qualquer forma, o mercado de alto desempenho está migrando para um processamento mais paralelo na forma de FPGAs. A Intel comprou recentemente a Altera (o segundo maior fabricante de FPGA) e agora está vendendo placas com um acelerador de hardware FPGA. O software pode carregar o FPGA com uma imagem em tempo de execução usando uma chamada de API. A CPU alimenta os dados no FPGA e permite que ele faça a maior parte do trabalho. Os tipos de aplicativos são tipicamente codificação de vídeo, IA, renderização, pesquisa em banco de dados etc.


Lembre-se também de que geralmente existem centenas ou milhares de threads em execução ao mesmo tempo em um PC. Não, não está funcionando . Existem muitos threads em desktops modernos, mas quase todos estão em espera aguardando E / S ou um timer a qualquer momento. por exemplo, a média de carga (no último minuto) na minha área de trabalho Linux está atualmente com 0,19 tarefas ativamente prontas para usar o tempo da CPU a qualquer momento. Se eu estivesse executando uma codificação de vídeo, o x264 teria iniciado vários threads para o SO agendar em vários núcleos, mas apenas o número de núcleos lógicos.
Peter Cordes

E, BTW, o OP (por algum motivo) omitiu completamente a frequência e perguntou sobre a escala do IPC (instruções por ciclo de clock), não por segundo. O que você diz é verdade, mas eles estavam propondo tornar as CPUs mais amplas , não com freqüência maior. Eu já resolvi isso na minha resposta, portanto, sua resposta para explicar o dimensionamento de energia com frequência é uma boa adição, +1.
Peter Cordes

@ PeterCordes Isso está correto, eu não quis dizer que todos os threads são executados ao mesmo tempo, é claro que se revezam. Agradeço por ter esclarecido.
user4574 14/06

Bem, nem tanto "revezam-se" que não estão prontas para correr, na maioria das vezes. Eles estão quase todos adormecidos, geralmente apenas acordando para uma pequena explosão de computação, por exemplo, depois que o sistema operacional fornece um pressionamento de tecla par ou uma leitura de rede, ou os acorda porque o temporizador expirou. É raro que mais de 2 estejam acordados de uma só vez, a menos que você esteja realmente fazendo algo computacionalmente intensivo. E se você é, não inicia centenas de threads, inicia vários threads ~ = número de núcleos disponíveis.
Peter Cordes

2

Apenas para completar a imagem de onde tudo isso está indo ...

Redes neurais e IA são os tópicos super quentes do momento. Uma razão é que é possível usar eficientemente um grande número de núcleos simples em paralelo e, assim, extrair quase o máximo do desempenho computacional. O requisito é inerentemente paralelo em massa e mapeia com bastante facilidade na matriz de processadores sem muita comunicação necessária entre os núcleos. É por isso que as GPUs foram a primeira tecnologia a ir para a aceleração da IA. No momento, estamos vendo chips otimizados ainda melhor do que as GPUs de vídeo para NNs chegando ao mercado. O próximo passo, ou talvez final, é fazer NNs usando tecnologias analógicas como memristores.

E como um aparte, em algo como um PC para jogos, há muito mais desempenho bruto na placa de vídeo do que os processadores Intel ou AMD multicore


2
Re "... inerentemente massivamente paralelo" : Mesmo embaraçosamente paralelo ?
Peter Mortensen

1

Fundamentalmente, as perdas de CMOS são exponencialmente (^ 1,5) proporcionais à frequência e o desempenho paralelo da CPU é um pouco menor que linear proporcional ao número de CPUs.

Portanto, a taxa de dissipação de energia para dissipação de energia é aprimorada para aplicativos com várias CPUs em diferentes taxas de clock ao comparar velocidade versus quantidade de CPU para uma dissipação de energia fixa.

É mais complexo do que isso, mas esses são os fundamentos da razão pela qual as CPUs paralelas são melhores em termos de watts em aplicativos dinâmicos. Sempre haverá exceções quando otimizadas para um cenário.

Não é o tamanho de uma CPU maior que o torna mais rápido para aplicativos típicos de PCs Intel / AMD, mas o tamanho reduzido da resolução litográfica e da capacitância de porta mais baixa que reduz a energia, juntamente com o nível de sublimiar mínimo e a voltagem do núcleo.

A melhoria não é linear e não significa que 8 núcleos são 4x melhores que 2, mas o objetivo a ser alcançado é ter mais faixa dinâmica de processamento com a otimização da dissipação de energia, velocidade e tensão para melhorar o desempenho e a eficiência e o pico de potência sob demanda sem aumento excessivo de temperatura.

Para uma resposta mais científica, leia https://www.sciencedirect.com/topics/computer-science/dynamic-power-consumption


-2

Multicores geralmente não são multiscalar. E núcleos multiscalares não são multicores.

Seria meio que perfeito encontrar uma arquitetura multiscalar rodando em vários megahertz, mas em geral suas pontes não seriam habilitadas para o consumidor, mas caras, portanto a tendência é a programação multicore em frequência mais baixa do que instruções curtas em altas velocidades de clock.

Vários núcleos de instrução são mais baratos e fáceis de comandar, e é por isso que é uma má idéia ter arquiteturas multiscalar em vários gigahertz.


11
Você quer dizer "superescalar", várias instruções por relógio? A maioria das CPUs com vários núcleos é superescalar. por exemplo, Ryzen tem 5 de largura. Os chips AArch64 de ponta da Apple têm 6 ou 8 de largura. Há muita fruta pendente para uma CPU de 2 amplos explorar na maioria dos códigos; portanto, vale a pena tornar cada núcleo com pelo menos 2 amplos antes de escalar para vários núcleos que precisam de seu próprio cache privado e uma interconexão entre núcleos ( por exemplo, as placas de computação de múltiplos núcleos Xeon Phi da Intel têm muitos núcleos de emissão dupla). O mesmo para núcleos de smartphones: núcleos pequenos têm pelo menos 2 de largura. O desempenho de thread único é importante!
Peter Cordes

11
Ou você quis dizer dl.acm.org/citation.cfm?id=224451 - um trabalho de pesquisa sobre o que eles chamam de núcleos "multiscalares" que procuram por ILP em intervalos maiores no gráfico de fluxo de controle de um programa de alto nível, usando uma combinação de HW e SW. As principais CPUs que usamos em desktops e smartphones não são assim, são apenas superescalares comuns com execução fora de ordem, implementando um ISA serial que finge executar instruções uma de cada vez.
Peter Cordes

Obrigado. Depois, a idéia por trás do arco escalar é a mensurabilidade do calor por trás de conjuntos de instruções conhecidos ou predefinidos (o caso do AVX). <br/> O cálculo das arquiteturas atuais versus o calor é considerado não previsível computacionalmente. isso aumenta a improbabilidade que os multicores podem ser executados em grandes frequências, pois sua capacidade de executar um ideal de tempo / calor não é computável. isso é tudo que sei até agora. estou cavando máquinas de vetores para esse fim de entender a física dos "multiscalars". o caso é xeon / phy e segue uma curva térmica ideal como a cpus antiga fez. melhorando a experiência do cliente
machtur 14/06

Conjuntos de instruções SIMD, como o AVX, são uma maneira de obter mais trabalho no pipeline sem precisar tornar todo o pipeline mais amplo, apenas as unidades de execução. Por exemplo, o Skylake pode executar 3 vpaddd ymm0, ymm1, ymm2instruções por relógio, cada uma executando 8 adições de números inteiros de 32 bits. Portanto, 24 números inteiros são adicionados por relógio, mas o mecanismo de execução fora de ordem "apenas" precisa acompanhar três instruções em voo. É muito mais barato construir do que uma CPU que pode executar 24 add eax, edxinstruções por relógio. O SIMD é basicamente ortogonal à largura do pipeline.
Peter Cordes

Skylake é um bom caso de otimização por ciclo de clock. as variantes são numerosas e eu não gosto delas, que são casos interessantes de otimização de barramento interno, já que os skylakes integram a descarga original do Xeon no pipeline do SIMD dessa maneira. Presumo que um grande núcleo integre a transferência e a computação em poucos ciclos, da mesma forma que (por exemplo) o fenômeno para o AVX. é a maneira como a computação se integra para a frente versus a energia necessária para operações de bloco interno. em oposição a várias instruções curtas, como no tipo Gpu, com vários núcleos "virtuais" semelhantes a adições ao Nehalem
machtur
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.