Como tipos de instrução diferentes são definidos em microprocessadores AMD para identificar fluxos do DirectPath vs VectorPath?

3

Na arquitetura AMD 10h, como o Opteron, as instruções pré-buscadas depois de alinhadas são separadas em dois fluxos: DirectPath (ou FastPath) e VectorPath (mecanismo Microcode). Posteriormente, esses fluxos estarão prontos para caminhos de execução inteiros ou de ponto flutuante.

Qual é o método que as instruções buscadas são marcadas para o fluxo? Existe um bit de bandeira ou algum tipo?

A documentação da AMD é muito vaga sobre o mecanismo de diferenciação. O único mencionado é:

Quando a janela de instrução de 32 bytes é obtido a partir do cache de instrução L1, os bytes de instrução são examinados para determinar se o O tipo de decodificação básica a ocorrer é o DirectPath ou o VectorPath.

    
por val 22.11.2011 / 22:56

1 resposta

0

TL: DR: os diferentes caminhos não são tão diferentes. A maior diferença após a decodificação é FP / SIMD versus Integer, que ocorrem em agendadores diferentes, mesmo que haja instruções do DirectPath para ambos.

Veja também a publicação da microarquitetura do Barcelona de David Kanter (AMD Fam10h) . Seu diagrama do front-end em K10 / K8 / Core2 é altamente relevante:

Paramaislinksparacoisascomoessa,consulteo wiki da tag x86 em SO

A partir do guia microarquizado de Agner Fog ( link ), capítulo K8 / K10:

17.3 Predecoding and instruction length decoding

An instruction can have any length from 1 to 15 bytes. The instruction boundaries are marked in the code cache and copied into the level-2 cache. Instruction length decoding is therefore rarely a bottleneck, even though the instruction length decoder can handle only one instruction per clock cycle.

Isso pode ser separado da geração das outras informações de pré-decodificação, pois Agner diz que as informações de comprimento de instrução também são armazenadas no cache L2, mas outras informações pré-decodificadas precisam ser regeneradas ao buscar de L2 em L1I.

The level-1 code cache contains a considerable amount of predecode information. This includes information about where each instruction ends, where the opcode byte is, as well as distinctions between single, double and vector path instructions and identification of jumps and calls. Some of this information is copied to the level-2 cache, but not all. The low bandwidth for instructions coming from the level-2 cache may be due to the process of adding more predecode information.

Os detalhes reais do formato de armazenamento dos dados extras não são conhecidos. Presumivelmente, cada linha de cache L1I possui alguns bytes extras na matriz de dados além dos 64B do conteúdo da memória, em algum formato personalizado. Parece que isso levaria um espaço extra significativo para lidar com o caso de canto em que cada instrução era um único byte.

Esses fluxos separados não são todos separados. Existem três decodificadores, e eles podem decodificar até 3 instruções do DirectPath (produzindo até três macro-operações), ou uma instrução VectorPath pode ser decodificada.

Agner Fog diz:

Vector path instructions are less efficient than single or double instructions because they require exclusive access to the decoders and pipelines and do not always reorder optimally. For example:

; Example 17.1. AMD instruction breakdown
xchg eax, ebx        ; Vector path, 3 ops
nop                  ; Direct path, 1 op
xchg ecx, edx        ; Vector path, 3 ops
nop                  ; Direct path, 1 op

This sequence takes 4 clock cycles to decode because the vector path instructions must decode alone.

(Esse exemplo é para o K8. K10 executa xchg r,r como uma instrução de 2 m-op. Agner diz que apenas o K8 tem instruções do DirectPath Double (e o K10 tem apenas vetor vs. vetor), mas isso não concorda com o que O diagrama de David Kanter mostra: Ele mostra um buffer de pacote com um throughput de 3 m-ops (também conhecido como uops) por clock, mas os decodificadores que o alimentam podem produzir 1 ou 2 uops por ciclo.

A família Bulldozer também tem instruções duplas e seus decodificadores podem produzir até 4 m-ops por clock. Assim, ele pode decodificar uma única instrução Vectorpath ou 1-1-1-1 (quatro instruções individuais do Directpath) ou 2-1-1. Isso implica que apenas o primeiro decodificador pode manipular instruções Double.  Piledriver e mais tarde também podem decodificar padrões 2-2 (duas instruções consecutivas do DirectPath Double).

O Ryzen tem um cache uop para instruções decodificadas. Ele pode emitir até 5 instruções do DirectPath Single por clock em seu núcleo fora de ordem. Mas se alguma das instruções for Double instructions, pode executar 6 uops por clock. (Então o AVX / AVX2 pode valer a pena no Ryzen mesmo que ele execute 256b instruções como dois uops.)

A estratégia da Intel é bem diferente :

Eles pré-decodificam o comprimento, mas não o armazenam em nenhum lugar a longo prazo. Os decodificadores tentam decodificar, e se uma instrução não funciona em um decodificador simples, é uma instrução multi-uop e terá que esperar o próximo ciclo de clock para o decodificador complexo lidar com isso.

O decodificador complexo pode manipular instruções de até 4 uops diretamente, caso contrário, os uops têm que vir do microcódigo.

    
por 08.09.2017 / 10:43