# Arquitectura de sistemes heterogenis

Heterogeneous System Architecture (HSA) és un conjunt d'especificacions entre proveïdors que permeten la integració d'unitats centrals de processament i processadors gràfics al mateix bus, amb memòria i tasques compartides. L'HSA està sent desenvolupat per la Fundació HSA, que inclou (entre molts altres) AMD i ARM. L'objectiu declarat de la plataforma és reduir la latència de comunicació entre CPU, GPU i altres dispositius informàtics, i fer que aquests diferents dispositius siguin més compatibles des de la perspectiva d'un programador, alliberant el programador de la tasca de planificar el moviment de dades entre les memòries discontinues dels dispositius (com s'ha de fer actualment amb OpenCL o CUDA).
CUDA i OpenCL, així com la majoria d'altres llenguatges de programació força avançats, poden utilitzar HSA per augmentar el seu rendiment d'execució. La informàtica heterogènia s'utilitza àmpliament en dispositius de sistema en xip com ara tauletes, telèfons intel·ligents, altres dispositius mòbils i consoles de videojocs. L'HSA permet als programes utilitzar el processador gràfic per a càlculs de coma flotant sense memòria ni programació separada.

## Justificació

La raó de l'HSA és alleujar la càrrega dels programadors quan descarreguen els càlculs a la GPU. Originalment impulsat únicament per AMD i anomenat FSA, la idea es va ampliar per abastar unitats de processament diferents de les GPU, com ara els DSP d'altres fabricants.
* Passos realitzats quan es descarreguen càlculs a la GPU en un sistema no HSA
* Passos realitzats en descarregar càlculs a la GPU en un sistema HSA, utilitzant la funcionalitat HSA
Les GPU modernes són molt adequades per realitzar una instrucció única, múltiples dades (SIMD) i una instrucció única, múltiples fils (SIMT), mentre que les CPU modernes encara s'estan optimitzant per a la ramificació. etc.

## Visió general

Introduït originalment per sistemes integrats com el Cell Broadband Engine, compartir memòria del sistema directament entre diversos actors del sistema fa que la informàtica heterogènia sigui més generalitzada. La informàtica heterogènia en si fa referència a sistemes que contenen múltiples unitats de processament – unitats centrals de processament (CPU), unitats de processament gràfic (GPU), processadors de senyal digital (DSP) o qualsevol tipus de circuits integrats específics d'aplicació (ASIC). L'arquitectura del sistema permet que qualsevol accelerador, per exemple un processador gràfic, funcioni al mateix nivell de processament que la CPU del sistema.
Entre les seves característiques principals, HSA defineix un espai d'adreces virtuals unificat per a dispositius informàtics: on les GPU tradicionalment tenen la seva pròpia memòria, separada de la memòria principal (CPU), HSA requereix que aquests dispositius comparteixin taules de pàgines perquè els dispositius puguin intercanviar dades compartint punters. Això ha de ser compatible amb unitats de gestió de memòria personalitzades. Per fer possible la interoperabilitat i també per facilitar diversos aspectes de la programació, l'HSA està pensat per ser independent d'ISA tant per a les CPU com per als acceleradors, i per admetre llenguatges de programació d'alt nivell.
Fins ara, les especificacions HSA cobreixen:

### Capa intermèdia HSA

HSAIL (Heterogeneous System Architecture Intermediate Language), un conjunt d'instruccions virtuals per a programes paral·lels
* semblants a LLVM Intermediate Representation i SPIR (utilitzat per OpenCL i Vulkan)
* finalitzat amb un conjunt d'instruccions específics per un compilador JIT
* prendre decisions tardanes sobre quins nuclis han d'executar una tasca
* explícitament paral·lel
* admet excepcions, funcions virtuals i altres funcions d'alt nivell
* suport de depuració

### Model de memòria HSA

* compatible amb C++11, OpenCL, Java i. Models de memòria NET
* consistència relaxada
* dissenyat per admetre tant idiomes gestionats (per exemple, Java) com idiomes no gestionats (per exemple, C)
* farà que sigui molt més fàcil desenvolupar compiladors de tercers per a una àmplia gamma de productes heterogenis programats en Fortran, C++, C++ AMP, Java, etc.

### Despatx HSA i temps d'execució

* dissenyat per permetre la cua de tasques heterogènia: una cua de treball per nucli, distribució del treball en cues, equilibri de càrrega mitjançant robatori de treball
* qualsevol nucli pot programar el treball per a qualsevol altre, inclòs ell mateix
* reducció significativa de les despeses generals de planificació del treball per a un nucli
Els dispositius mòbils són una de les àrees d'aplicació de l'HSA, en què millora l'eficiència energètica.
Diagrames de blocs
* Arquitectura estàndard amb una GPU discreta connectada al bus PCI Express. La còpia zero entre la GPU i la CPU no és possible a causa de les diferents memòries físiques.
* HSA aporta memòria virtual unificada i facilita el pas de punters per PCI Express en lloc de copiar totes les dades.
* A la memòria principal particionada, una part de la memòria del sistema s'assigna exclusivament a la GPU. Com a resultat, l'operació de còpia zero no és possible.
* Memòria principal unificada, on la GPU i la CPU estan habilitades per HSA. Això fa possible l'operació de còpia zero.
* La MMU de la CPU i la IOMMU de la GPU han de complir ambdues les especificacions de maquinari HSA.
Les il·lustracions següents comparen la coordinació CPU-GPU sota HSA versus amb arquitectures tradicionals.

## Suport de programari

Algunes de les característiques específiques de l'HSA implementades al maquinari han de ser compatibles amb el nucli del sistema operatiu i els controladors de dispositiu específics. Per exemple, el suport per a les targetes gràfiques AMD Radeon i AMD FirePro, i les APU basades en Graphics Core Next (GCN), es va fusionar a la versió 3.19 de la línia principal del nucli de Linux, llançada el 8 de febrer de 2015. Els programes no interactuen directament ambamdkfd, però posen a la cua els seus treballs utilitzant el temps d'execució HSA. Aquesta primera implementació, coneguda comamdkfd, se centra en les APU "Kaveri" o "Berlin" i funciona juntament amb el controlador de gràfics del nucli Radeon existent.
A més,amdkfd admet cua heterogènia (HQ), que té com a objectiu simplificar la distribució de treballs computacionals entre múltiples CPU i GPU des de la perspectiva del programador. El suport per a la gestió de memòria heterogènia (HMM ), adequat només per a maquinari gràfic amb la versió 2 de l'IOMMU d'AMD, es va acceptar a la versió 4.14 de la línia principal del nucli de Linux.

## Suport de maquinari
### AMD

A Febrer 2015, only AMD's "Kaveri" A-series APUs (cf. "Kaveri" desktop processors and "Kaveri" mobile processors) and Sony's PlayStation 4 allowed the integrated GPU to access memory via version 2 of the AMD's IOMMU. Earlier APUs (Trinity and Richland) included the version 2 IOMMU functionality, but only for use by an external GPU connected via PCI Express.

### ARM

La microarquitectura Bifrost d'ARM, tal com s'ha implementat al Mali-G71, és totalment compatible amb les especificacions de maquinari HSA 1.1. A Juny 2016, ARM no ha anunciat suport de programari que utilitzi aquesta funció de maquinari.

## Referències

* ↑ Tarun Iyer. «AMD Unveils its Heterogeneous Uniform Memory Access (hUMA) Technology» (en anglès). Tom's Hardware, 30-04-2013.
* ↑ «What is Heterogeneous System Architecture (HSA)?» (en anglès). AMD. Arxivat de l'original el 21 juny 2014. [Consulta: 23 maig 2014].
* ↑ Joel Hruska. «Setting HSAIL: AMD explains the future of CPU/GPU cooperation» (en anglès). ExtremeTech. Ziff Davis, 26-08-2013.
* ↑ Linaro. «LCE13: Heterogeneous System Architecture (HSA) on ARM» (en anglès). slideshare.net, 21-03-2014.
* ↑ «Heterogeneous System Architecture: Purpose and Outlook» (en anglès). gpuscience.com, 09-11-2012. Arxivat de l'original el 2014-02-01. [Consulta: 24 maig 2014].
* ↑ «Heterogeneous system architecture: Multicore image processing using a mix of CPU and GPU elements» (en anglès). Embedded Computing Design. [Consulta: 23 maig 2014].
* ↑ «Heterogeneous System Architecture: Purpose and Outlook» (en anglès). gpuscience.com, 09-11-2012. Arxivat de l'original el 2014-02-01. [Consulta: 24 maig 2014].
* ↑ «Kaveri microarchitecture», 15-01-2014.
* ↑ Michael Larabel. «AMDKFD Driver Still Evolving For Open-Source HSA On Linux» (en anglès). Phoronix, 21-07-2014. [Consulta: 21 gener 2015].
* ↑ «Linux kernel 3.19, Section 1.3. HSA driver for AMD GPU devices» (en anglès). kernelnewbies.org, 08-02-2015. [Consulta: 12 febrer 2015].
* ↑ «Linux kernel 3.19, Section 1.3. HSA driver for AMD GPU devices». kernelnewbies.org, 08-02-2015. [Consulta: 12 febrer 2015].
* ↑ «HSA-Runtime-Reference-Source/README.md at master» (en anglès). github.com, 14-11-2014. [Consulta: 12 febrer 2015].
* ↑ «Linux Kernel 4.14 Announced with Secure Memory Encryption and More» (en anglès), 13-11-2017.
* ↑ «ARM Bifrost GPU Architecture» (en anglès), 30-05-2016.