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
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.
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
HSAIL (Heterogeneous System Architecture Intermediate Language), um conjunto de instruções virtuais para programas paralelos
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
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
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
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]
A MMU da CPU e a IOMMU da GPU devem estar em conformidade com as especificações de hardware HSA.
Suporte de software
As GPUs AMD contêm certas unidades funcionais adicionais destinadas a serem usadas como parte do HSA. No Linux, o driver do kernel amdkfd fornece o suporte necessário.[8][9]
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]
↑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
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.