Heterogeneous System Architecture
Heterogeneous System Architecture (HSA) é um conjunto de especificações de vários fornecedores que permite a integração de unidades centrais de processamento e processadores gráficos no mesmo barramento, com memória e tarefas compartilhadas.[1] O HSA está sendo desenvolvido pela HSA Foundation, que inclui (entre muitos outros) AMD e ARM. O objetivo declarado da plataforma é reduzir a latência de comunicação entre CPUs, GPUs e outros dispositivos de computação e tornar esses vários dispositivos mais compatíveis da perspectiva do programador,[2]:3[3] aliviando o programador da tarefa de planejar a movimentação de dados entre memórias disjuntas de dispositivos (como deve ser feito atualmente com OpenCL ou CUDA).[4]
CUDA e OpenCL, bem como a maioria das outras linguagens de programação bastante avançadas, podem usar HSA para aumentar seu desempenho de execução. A computação heterogênea é amplamente utilizada em dispositivos de sistema em chip, como tablets, smartphones, outros dispositivos móveis e consoles de videogame.[5] O HSA permite que os programas usem o processador gráfico para cálculos de ponto flutuante sem memória ou agendamento separado.[6]
Justificativa
[editar | editar código]A lógica por trás do HSA é aliviar a carga dos programadores ao transferir cálculos para a GPU. Originalmente impulsionada exclusivamente pela AMD e chamada de FSA, a ideia foi estendida para abranger unidades de processamento além de GPUs, como DSPs de outros fabricantes.
- Etapas executadas ao descarregar cálculos para a GPU em um sistema não HSA
- Etapas executadas ao descarregar cálculos para a GPU em um sistema HSA, usando a funcionalidade HSA
As GPUs modernas são muito adequadas para executar instruções únicas, vários dados (SIMD) e instruções únicas, vários threads (SIMT), enquanto as CPUs modernas ainda estão sendo otimizadas para ramificação. etc.
Visão geral
[editar | editar código]Originalmente introduzido por sistemas embarcados como o Cell Broadband Engine, o compartilhamento de memória do sistema diretamente entre vários participantes do sistema torna a computação heterogênea mais comum. A computação heterogênea em si se refere a sistemas que contêm múltiplas unidades de processamento – unidades centrais de processamento (CPUs), unidades de processamento gráfico (GPUs), processadores de sinais digitais (DSPs) ou qualquer tipo de circuito integrado específico para aplicações (ASICs). A arquitetura do sistema permite que qualquer acelerador, por exemplo, um processador gráfico, opere no mesmo nível de processamento que a CPU do sistema.
Entre seus principais recursos, o HSA define um espaço de endereço virtual unificado para dispositivos de computação: enquanto as GPUs tradicionalmente têm sua própria memória, separada da memória principal (CPU), o HSA exige que esses dispositivos compartilhem tabelas de páginas para que os dispositivos possam trocar dados compartilhando ponteiros. Isso deve ser suportado por unidades de gerenciamento de memória personalizadas.[2]:6–7 Para tornar a interoperabilidade possível e também facilitar vários aspectos da programação, o HSA foi criado para ser independente de ISA tanto para CPUs quanto para aceleradores, e para oferecer suporte a linguagens de programação de alto nível.
Até agora, as especificações do HSA abrangem:
Camada intermediária HSA
[editar | editar código]HSAIL (Heterogeneous System Architecture Intermediate Language), um conjunto de instruções virtuais para programas paralelos
- semelhante à LLVM Intermediate Representation e SPIR (usado por OpenCL e Vulkan)
- finalizado para um conjunto de instruções específico por um compilador JIT
- tomar decisões tardias sobre quais núcleos devem executar uma tarefa
- explicitamente paralelo
- suporta exceções, funções virtuais e outros recursos de alto nível
- suporte para depuração
Modelo de memória HSA
[editar | editar código]- compatível com modelos de memória C++11, OpenCL, Java e .NET
- consistência relaxada
- projetado para oferecer suporte a linguagens gerenciadas (por exemplo, Java) e não gerenciadas (por exemplo, C)
- tornará muito mais fácil desenvolver compiladores de terceiros para uma ampla gama de produtos heterogêneos programados em Fortran, C++, C++ AMP, Java, et al.
Despachante HSA e tempo de execução
[editar | editar código]- projetado para permitir enfileiramento de tarefas heterogêneo: uma fila de trabalho por núcleo, distribuição de trabalho em filas, balanceamento de carga por roubo de trabalho
- qualquer núcleo pode agendar trabalho para qualquer outro, incluindo ele mesmo
- redução significativa da sobrecarga de trabalho de agendamento para um núcleo
Os dispositivos móveis são uma das áreas de aplicação do HSA, na qual ele produz maior eficiência energética.[5]
Diagramas de blocos
[editar | editar código]As ilustrações abaixo comparam a coordenação CPU-GPU sob HSA em comparação com arquiteturas tradicionais.
- Arquitetura padrão com uma GPU discreta conectada ao barramento PCI Express. A cópia zero entre a GPU e a CPU não é possível devido às memórias físicas distintas.
- O HSA traz memória virtual unificada e facilita a passagem de ponteiros pelo PCI Express em vez de copiar todos os dados.
- Na memória principal particionada, uma parte da memória do sistema é alocada exclusivamente para a GPU. Como resultado, a operação de cópia zero não é possível.
- Memória principal unificada, onde GPU e CPU são habilitados para HSA. Isso torna possível a operação de cópia zero.[7]
Suporte de software
[editar | editar código]
Alguns dos recursos específicos do HSA implementados no hardware precisam ser suportados pelo kernel do sistema operacional e por drivers de dispositivo específicos. Por exemplo, o suporte para placas de vídeo AMD Radeon e AMD FirePro, e APUs baseadas no Graphics Core Next (GCN), foi incorporado à versão 3.19 do kernel principal do Linux, lançada em 8 de fevereiro de 2015.[9] Os programas não interagem diretamente com amdkfd, mas enfileiram seus trabalhos utilizando o tempo de execução do HSA.[10] Esta primeira implementação, conhecida como amdkfd, foca em APUs "Kaveri" ou "Berlin" e funciona junto com o driver gráfico do kernel Radeon existente.
Adicionalmente, amdkfd oferece suporte ao heterogeneous queuing (HQ), que visa simplificar a distribuição de trabalhos computacionais entre várias CPUs e GPUs da perspectiva do programador. O suporte para gerenciamento de memória heterogênea (HMM), adequado apenas para hardware gráfico com a versão 2 do IOMMU da AMD, foi aceito na versão principal do kernel Linux 4.14.[11]
O suporte integrado para plataformas HSA foi anunciado para o lançamento "Sumatra" do OpenJDK, previsto para 2015.[12]
O AMD APP SDK é um kit de desenvolvimento de software proprietário da AMD voltado para computação paralela, disponível para Microsoft Windows e Linux. Bolt é uma biblioteca de modelos C++ otimizada para computação heterogênea.[13]
O GPUOpen abrange algumas outras ferramentas de software relacionadas ao HSA. A versão 2.0 do CodeXL inclui um profiler HSA.[14]
Suporte de hardware
[editar | editar código]AMD
[editar | editar código]Em fevereiro de 2015, apenas as APUs da série A "Kaveri" da AMD (cf. processadores para desktop "Kaveri" e processadores dispositivos móveis "Kaveri") e o PlayStation 4 da Sony permitiam que a GPU integrada acessasse a memória por meio da versão 2 do IOMMU da AMD. APUs anteriores (Trinity e Richland) incluíam a funcionalidade do IOMMU da versão 2, mas apenas para uso por uma GPU externa conectada via PCI Express.[carece de fontes]
As APUs Carrizo e Bristol Ridge posteriores a 2015 também incluem a funcionalidade IOMMU versão 2 para a GPU integrada.[carece de fontes]
A tabela a seguir mostra recursos das APUs da AMD
| Plataforma | Alta, padrão e baixa potência | Baixa e ultra baixa potência | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Nome de código | Servidor | Basic | Toronto | |||||||||||||||||
| Micro | Kyoto | |||||||||||||||||||
| Desktop | Performance | Renoir | Cezanne | |||||||||||||||||
| Mainstream | Llano | Trinity | Richland | Kaveri | Kaveri Refresh (Godavari) | Carrizo | Bristol Ridge | Raven Ridge | Picasso | |||||||||||
| Entrada | ||||||||||||||||||||
| Basic | Kabini | |||||||||||||||||||
| Mobile | Performance | Renoir | Cezanne | Rembrandt | ||||||||||||||||
| Mainstream | Llano | Trinity | Richland | Kaveri | Carrizo | Bristol Ridge | Raven Ridge | Picasso | ||||||||||||
| Entrada | Dalí | |||||||||||||||||||
| Basic | Desna, Ontario, Zacate | Kabini, Temash | Beema, Mullins | Carrizo-L | Stoney Ridge | |||||||||||||||
| Integrado | Trinity | Bald Eagle | Merlin Falcon, Brown Falcon |
Great Horned Owl | Grey Hawk | Ontario, Zacate | Kabini | Steppe Eagle, Crowned Eagle, LX-Family |
Prairie Falcon | Banded Kestrel | ||||||||||
| Lançado | Agosto de 2011 | Outubro de 2012 | Junho de 2013 | Janeiro de 2014 | 2015 | Junho de 2015 | Junho de 2016 | Outubro de 2017 | Janeiro de 2019 | Março de 2020 | Janeiro de 2021 | Janeiro de 2022 | Janeiro de 2011 | Maio 2013 | Apr 2014 | Maio de 2015 | Fevereiro de 2016 | Abril de 2019 | ||
| Microarquitetura de CPU | K10 | Piledriver | Steamroller | Excavator | "Excavator+"[15] | Zen | Zen+ | Zen 2 | Zen 3 | Zen 3+ | Bobcat | Jaguar | Puma | Puma+[16] | "Excavator+" | Zen | ||||
| ISA | x86-64 | x86-64 | ||||||||||||||||||
| Socket | Desktop | High-end | — | — | ||||||||||||||||
| Mainstream | — | AM4 | — | |||||||||||||||||
| Entrada | FM1 | FM2 | FM2+[nota 1] | — | ||||||||||||||||
| Basic | — | — | AM1 | — | ||||||||||||||||
| Outros | FS1 | FS1+, FP2 | FP3 | FP4 | FP5 | FP6 | FP7 | FT1 | FT3 | FT3b | FP4 | FP5 | ||||||||
| Versão PCI Express | 2.0 | 3.0 | 4.0 | 2.0 | 3.0 | |||||||||||||||
| Fab. (nm) | GF 32SHP (HKMG SOI) |
GF 28SHP (HKMG bulk) |
GF 14LPP (FinFET bulk) |
GF 12LP (FinFET bulk) |
TSMC N7 (FinFET bulk) |
TSMC N6 (FinFET bulk) |
TSMC N40 (bulk) |
TSMC N28 (HKMG bulk) |
GF 28SHP (HKMG bulk) |
GF 14LPP (FinFET bulk) | ||||||||||
| Area do Die (mm2) | 228 | 246 | 245 | 245 | 250 | 210[17] | 156 | 180 | 210 | 75 (+ 28 FCH) | 107 | ? | 125 | 149 | ||||||
| TDP min. (W) | 35 | 17 | 12 | 10 | 15 | 4.5 | 4 | 3.95 | 10 | 6 | ||||||||||
| TDP max. de APU (W) | 100 | 95 | 65 | 45 | 18 | 25 | ||||||||||||||
| Clock base max. de stock de APU (GHz) | 3 | 3.8 | 4.1 | 4.1 | 3.7 | 3.8 | 3.6 | 3.7 | 3.8 | 4.0 | 3.3 | 1.75 | 2.2 | 2 | 2.2 | 3.2 | 2.6 | |||
| Máximo de APUs por nó[nota 2] | 1 | 1 | ||||||||||||||||||
| Max CPU[nota 3] cores por APU | 4 | 8 | 2 | 4 | 2 | |||||||||||||||
| Max threads por core de CPU | 1 | 2 | 1 | 2 | ||||||||||||||||
| i386, i486, i586, CMOV, NOPL, i686, PAE, NX bit, CMPXCHG16B, AMD-V, RVI, ABM, e LAHF/SAHF de 64-bit | ||||||||||||||||||||
| IOMMU[nota 4] | — | |||||||||||||||||||
| BMI1, AES-NI, CLMUL, e F16C | — | |||||||||||||||||||
| MOVBE | — | |||||||||||||||||||
| AVIC, BMI2 e RDRAND | — | |||||||||||||||||||
| ADX, SHA, RDSEED, SMAP, SMEP, XSAVEC, XSAVES, XRSTORS, CLFLUSHOPT, e CLZERO | — | — | ||||||||||||||||||
| WBNOINVD, CLWB, RDPID, RDPRU, e MCOMMIT | — | — | ||||||||||||||||||
| FPUs por core | 1 | 0.5 | 1 | 1 | 0.5 | 1 | ||||||||||||||
| Tubos por FPU | 2 | 2 | ||||||||||||||||||
| Largura do tubo FPU | 128-bit | 256-bit | 80-bit | 128-bit | ||||||||||||||||
| Nível SIMD do conjunto de instruções da CPU | SSE4a[nota 5] | AVX | AVX2 | SSSE3 | AVX | AVX2 | ||||||||||||||
| 3DNow! | — | — | ||||||||||||||||||
| FMA4, LWP, TBM, e XOP | — | — | — | — | ||||||||||||||||
| FMA3 | ||||||||||||||||||||
| Cache L1 de dados por núcleo (KiB) | 64 | 16 | 32 | 32 | ||||||||||||||||
| Associatividade do cache de dados L1 (maneiras) | 2 | 4 | 8 | 8 | ||||||||||||||||
| Caches de instruções L1 por core | 1 | 0.5 | 1 | 1 | 0.5 | 1 | ||||||||||||||
| Cache máximo de instrução L1 total da APU (KiB) | 256 | 128 | 192 | 256 | 64 | 128 | 96 | 128 | ||||||||||||
| Associatividade de cache de instrução L1 (maneiras) | 2 | 3 | 4 | 8 | 2 | 3 | 4 | |||||||||||||
| Caches L2 por core | 1 | 0.5 | 1 | 1 | 0.5 | 1 | ||||||||||||||
| Cache L2 total de APU máximo (MiB) | 4 | 2 | 4 | 1 | 2 | 1 | ||||||||||||||
| Associatividade de cache L2 (maneiras) | 16 | 8 | 16 | 8 | ||||||||||||||||
| Cache L3 total da APU (MiB) | — | 4 | 8 | 16 | — | 4 | ||||||||||||||
| Associatividade de cache APU L3 (maneiras) | 16 | 16 | ||||||||||||||||||
| Esquema de cache L3 | Victim | Victim | ||||||||||||||||||
| Suporte max. de DRAM stock | DDR3-1866 | DDR3-2133 | DDR3-2133, DDR4-2400 | DDR4-2400 | DDR4-2933 | DDR4-3200, LPDDR4-4266 | DDR5-4800, LPDDR5-6400 | DDR3L-1333 | DDR3L-1600 | DDR3L-1866 | DDR3-1866, DDR4-2400 | DDR4-2400 | ||||||||
| Max. de canais DRAM por APU | 2 | 1 | 2 | |||||||||||||||||
| Max. largura de banda DRAM de stock por APU (GB/s) | 29.866 | 34.132 | 38.400 | 46.932 | 68.256 | 102.400 | 10.666 | 12.800 | 14.933 | 19.200 | 38.400 | |||||||||
| Microarquitetura GPU | TeraScale 2 (VLIW5) | TeraScale 3 (VLIW4) | GCN 2nd gen | GCN 3rd gen | GCN 5th gen[18] | RDNA 2nd gen | TeraScale 2 (VLIW5) | GCN 2nd gen | GCN 3rd gen[18] | GCN 5th gen | ||||||||||
| Conjunto de instruções da GPU | Conjunto de instruções TeraScale | Conjunto de instruções GCN | Conjunto de instruções RDNA | Conjunto de instruções TeraScale | Conjunto de instruções GCN | |||||||||||||||
| Clock base da GPU de stock máximo (MHz) | 600 | 800 | 844 | 866 | 1108 | 1250 | 1400 | 2100 | 2400 | 538 | 600 | ? | 847 | 900 | 1200 | |||||
| Max stock GPU base GFLOPS[nota 6] | 480 | 614.4 | 648.1 | 886.7 | 1134.5 | 1760 | 1971.2 | 2150.4 | 3686.4 | 86 | ? | ? | ? | 345.6 | 460.8 | |||||
| Motor 3D [nota 7] | Até 400:20:8 | Até 384:24:6 | Até 512:32:8 | Até 704:44:16[19] | Até 512:32:8 | 768:48:8 | 80:8:4 | 128:8:4 | Até 192:?:? | Até 192:?:? | ||||||||||
| IOMMUv1 | IOMMUv2 | IOMMUv1 | ? | IOMMUv2 | ||||||||||||||||
| Decodificador de vídeo | UVD 3.0 | UVD 4.2 | UVD 6.0 | VCN 1.0[20] | VCN 2.1[21] | VCN 2.2[21] | VCN 3.1 | UVD 3.0 | UVD 4.0 | UVD 4.2 | UVD 6.0 | UVD 6.3]] | VCN 1.0 | |||||||
| Codificador de vídeo | — | VCE 1.0 | VCE 2.0 | VCE 3.1 | — | VCE 2.0 | VCE 3.1 | |||||||||||||
| Movimento Fluido AMD | ||||||||||||||||||||
| Economia de energia da GPU | PowerPlay | PowerTune | PowerPlay | PowerTune[22] | ||||||||||||||||
| TrueAudio | — | ? | — | |||||||||||||||||
| FreeSync | 1 2 |
1 2 | ||||||||||||||||||
| HDCP[nota 8] | ? | 1.4 | 1.4 2.2 | ? | 1.4 | 1.4 2.2 | ||||||||||||||
| PlayReady[nota 9] | — | 3.0 not yet | — | 3.0 ainda não | ||||||||||||||||
| Telas compatíveis[nota 10] | 2–3 | 2–4 | 3 | 3 (desktop) 4 (mobile, integrado) | 4 | 2 | 3 | 4 | ||||||||||||
/drm/radeon[nota 11][25][26] | — | — | ||||||||||||||||||
/drm/amdgpu[nota 12][27] | — | — | ||||||||||||||||||
- ↑ Para modelos Excavator FM2+: A8-7680, A6-7480 e Athlon X4 845.
- ↑ Um PC seria um nó.
- ↑ Uma APU combina uma CPU e uma GPU. Ambos têm núcleos.
- ↑ Requer suporte de firmware
- ↑ No SSE4. No SSSE3.
- ↑ O desempenho de precisão simples é calculado a partir da velocidade de clock do núcleo base (ou boost) com base em uma operação FMA.
- ↑ Shaders unificados : unidades de mapeamento de textura : unidades de saída de renderização
- ↑ Para reproduzir conteúdo de vídeo protegido, também é necessário suporte a placa, sistema operacional, driver e aplicativo. Um monitor HDCP compatível também é necessário para isso. O HDCP é obrigatório para a saída de certos formatos de áudio, colocando restrições adicionais na configuração multimídia.
- ↑ Para reproduzir conteúdo de vídeo protegido, também é necessário suporte a placa, sistema operacional, driver e aplicativo. Um monitor HDCP compatível também é necessário para isso. O HDCP é obrigatório para a saída de certos formatos de áudio, colocando restrições adicionais na configuração multimídia.
- ↑ Para alimentar mais de dois monitores, os painéis adicionais devem ter suporte nativo para DisplayPort.[24] Alternativamente, adaptadores DisplayPort-to-DVI/HDMI/VGA ativos podem ser empregados.
- ↑ DRM (Direct Rendering Manager) é um componente do kernel Linux. O suporte nesta tabela refere-se à versão mais atual.
- ↑ DRM (Direct Rendering Manager) é um componente do kernel Linux. O suporte nesta tabela refere-se à versão mais atual.
ARM
[editar | editar código]A microarquitetura Bifrost da ARM, conforme implementada no Mali-G71,[29] é totalmente compatível com as especificações de hardware HSA 1.1. Em junho de 2016, a ARM não anunciou suporte de software que usaria esse recurso de hardware.
Ver também
[editar | editar código]Referências
- ↑ Tarun Iyer (30 de abril de 2013). «AMD Unveils its Heterogeneous Uniform Memory Access (hUMA) Technology». Tom's Hardware. Consultado em 30 de abril de 2025
- 1 2 George Kyriazis (30 de abril de 2025). Heterogeneous System Architecture: A Technical Review (PDF) (Relatório). AMD. Arquivado do original (PDF) em 28 de março de 2014
- ↑ «What is Heterogeneous System Architecture (HSA)?». AMD. Consultado em 30 de abril de 2025. Arquivado do original em 21 de junho de 2014
- ↑ Joel Hruska (26 de agosto de 2013). «Setting HSAIL: AMD explains the future of CPU/GPU cooperation». ExtremeTech. Ziff Davis. Consultado em 30 de abril de 2025
- 1 2 «Heterogeneous System Architecture: Purpose and Outlook». gpuscience.com. 9 de novembro de 2012. Consultado em 30 de abril de 2025. Cópia arquivada em 1 de fevereiro de 2014
- ↑ «Heterogeneous system architecture: Multicore image processing using a mix of CPU and GPU elements». Embedded Computing Design. Consultado em 30 de abril de 2025. Cópia arquivada em 26 de março de 2013
- ↑ «Kaveri microarchitecture». SemiAccurate. 15 de janeiro de 2014
- ↑ Michael Larabel (21 de julho de 2014). «AMDKFD Driver Still Evolving For Open-Source HSA On Linux». Phoronix. Consultado em 30 de abril de 2025
- 1 2