Em julho de 2017, o conjunto de instruções do Graphics Core Next teve cinco iterações. As diferenças entre as quatro primeiras gerações são mínimas, mas a arquitetura GCN de quinta geração apresenta processadores de fluxo bastante modificados para melhorar o desempenho e suportar o processamento simultâneo de dois números de menor precisão no lugar de um único número de maior precisão.
Compute units
Uma unidade de computação (Compute units, UC) combina 64 processadores de shader com 4 unidades de mapeamento de textura (TMUs). As unidades de computação são separadas, mas alimentam, as unidades de saída de renderização (ROPs). Cada unidade de computação consiste no seguinte:
- um CU scheduler
- uma Branch & Message Unit
- 4 SIMD Vector Units de 16 faixas de largura (SIMD-VUs)
- 4 arquivos de 64 KiB de registro de uso geral de vetores (VGPR)
- 1 scalar unit (SU)
- um arquivo GPR scalar de 8 KiB
- um compartilhamento de dados local de 64 KiB
- 4 Texture Filter Units
- 16 Texture Fetch Load/Store Units
- um Cache de 16 KiB de nível 1 (L1)
Quatro unidades de computação são conectadas para compartilhar um cache de instruções L1 de 16 KiB e um cache de dados L1 de 32 KiB, ambos somente leitura. Um SIMD-VU opera em 16 elementos por vez (por ciclo), enquanto um SU pode operar em um por vez (um/ciclo). Além disso, o SU lida com algumas outras operações, como ramificação.
Cada SIMD-VU tem alguma memória privada onde armazena seus registradores. Existem dois tipos de registradores: registradores escalares (S0, S1, etc.), que contêm números de 4 bytes cada, e registradores vetoriais (V0, V1, etc.), que representam cada um um conjunto de 64 números de 4 bytes. Nos registradores vetoriais, cada operação é feita em paralelo nos 64 números. que correspondem a 64 entradas. Por exemplo, ele pode funcionar em 64 pixels diferentes ao mesmo tempo (para cada um deles as entradas são ligeiramente diferentes e, portanto, você obtém uma cor ligeiramente diferente no final).
Cada SIMD-VU tem espaço para 512 registradores escalares e 256 registradores vetoriais.
A AMD afirmou que cada unidade de computação GCN (CU) tem 64 KiB de compartilhamento de dados local (LDS).
CU scheduler
O agendador CU (CU scheduler) é o bloco funcional de hardware, que escolhe quais frentes de onda o SIMD-VU executa. Ele escolhe um SIMD-VU por ciclo para agendamento. Não deve ser confundido com outros agendadores de hardware ou software.
Wavefront
Um shader é um pequeno programa escrito em GLSL que executa processamento gráfico, e um kernel é um pequeno programa escrito em OpenCL que executa processamento GPGPU. Esses processos não precisam de tantos registradores, mas precisam carregar dados da memória do sistema ou gráfica. Esta operação vem com latência significativa. A AMD e a Nvidia escolheram abordagens semelhantes para esconder essa latência inevitável: o agrupamento de vários threads. A AMD chama esse grupo de "wavefront", enquanto a Nvidia o chama de "warp". Um grupo de threads é a unidade mais básica de agendamento de GPUs que implementam essa abordagem para ocultar a latência. É o tamanho mínimo dos dados processados no modo SIMD, a menor unidade executável de código e a maneira de processar uma única instrução em todos os threads ao mesmo tempo.
Em todas as GPUs GCN, uma "wavefront" consiste em 64 threads, e em todas as GPUs Nvidia, uma "warp" consiste em 32 threads.
A solução da AMD é atribuir múltiplas frentes de onda a cada SIMD-VU. O hardware distribui os registradores para as diferentes frentes de onda e, quando uma frente de onda está esperando por algum resultado, que está na memória, o CU Scheduler atribui outra frente de onda ao SIMD-VU. As frentes de onda são atribuídas por SIMD-VU. SIMD-VUs não trocam frentes de onda. Um máximo de 10 frentes de onda podem ser atribuídas por SIMD-VU (portanto, 40 por CU).
O AMD CodeXL mostra tabelas com a relação entre o número de SGPRs e VGPRs em relação ao número de frentes de onda, mas essencialmente, para SGPRS é entre 104 e 512 por número de frentes de onda, e para VGPRS é 256 por número de frentes de onda.
Observe que, em conjunto com as instruções SSE, esse conceito do nível mais básico de paralelismo é frequentemente chamado de "largura de vetor". A largura do vetor é caracterizada pelo número total de bits nele contidos.
SIMD Vector Unit
Cada Unidade Vetorial SIMD (SIMD Vector Unit) possui:
- uma Unidade Lógica Aritmética (Arithmetic Logic Unit, ALU) de 16 pistas, com vetores inteiros e de ponto flutuante
- 64 Arquivo KiB Vector General Purpose Register (VGPR)
- 10× Contadores de Programa (Program Counters) de 48 bits
- Buffer de instruções para 10 wavefronts (cada wavefront é um grupo de 64 threads, ou o tamanho de um VGPR lógico)
- Uma wavefront de 64 threads emite para uma SIMD Unit de 16 pistas ao longo de quatro ciclos
Cada SIMD-VU tem 10 buffers de instruções de wavefront e leva 4 ciclos para executar uma wavefront.
Blocos de aceleração de áudio e vídeo
Muitas implementações do GCN são normalmente acompanhadas por vários outros blocos ASIC da AMD. Incluindo, mas não se limitando ao Unified Video Decoder, Video Coding Engine e AMD TrueAudio.
Video Coding Engine
O Video Coding Engine é um ASIC de codificação de vídeo, introduzido pela primeira vez com a série Radeon HD 7000.
A versão inicial do VCE adicionou suporte para codificação de quadros I e P H.264 no formato de pixel YUV420, juntamente com codificação temporal SVE e modo de codificação de exibição, enquanto a segunda versão adicionou suporte de quadro B para quadros I YUV420 e YUV444.
O VCE 3.0 fez parte da terceira geração do GCN, adicionando dimensionamento de vídeo de alta qualidade e o codec HEVC (H.265).
O VCE 4.0 fazia parte da arquitetura Vega e foi posteriormente sucedido pelo Video Core Next.
Agendadores de hardware
Os agendadores de hardware são usados para executar o agendamento e descarregar a atribuição de filas de computação aos ACEs do driver para o hardware, armazenando essas filas em buffer até que haja pelo menos uma fila vazia em pelo menos um ACE. Isso faz com que o HWS atribua imediatamente filas armazenadas em buffer aos ACEs até que todas as filas estejam cheias ou não haja mais filas para atribuir com segurança.
Parte do trabalho de agendamento realizado inclui filas priorizadas que permitem que tarefas críticas sejam executadas com prioridade mais alta do que outras tarefas sem exigir que as tarefas de prioridade mais baixa sejam preemptivas para executar a tarefa de alta prioridade, permitindo assim que as tarefas sejam executadas simultaneamente com as tarefas de alta prioridade agendadas para monopolizar a GPU o máximo possível, enquanto permite que outras tarefas usem os recursos que as tarefas de alta prioridade não estão usando. Esses são essencialmente mecanismos de computação assíncronos que não possuem controladores de despacho. Eles foram introduzidos pela primeira vez na microarquitetura GCN de quarta geração, mas estavam presentes na microarquitetura GCN de terceira geração para fins de testes internos. Uma atualização de driver habilitou os planejadores de hardware em peças GCN de terceira geração para uso em produção.