# ARM Mali

L'architecture Mali est une famille de processeurs graphiques conçue pour les smartphones et les tablettes tactiles ; elle est développée par la société ARM pour les SoC basés sur l'architecture ARM et intégrée sous licence par différents fabricants de microélectronique. Elle a été développée par ARM Norway (anciennement Falanx) à Trondheim. Les architectures ont des noms scandinaves (Utgard, Midgard, Bifrost et Valhall).
On peut notamment retrouver ces processeurs graphiques dans certains SoC Exynos de Samsung, les A1X de Allwinner Technology, certains SoC WonderMedia de VIA, certains SoC Amlogic ou Rockchip, et notamment dans certains chipset Novathor de STMicroelectronics comme le U8500.

## Pilotes
### OpenGL ES

Le projet Lima driver a été créé en 2011 pour produire un pilote libre permettant d'accéder aux générations Mali-200 et Mali-400 de l'architecture utgard, puis il a été abandonné entre 2012 et 2013. Il est de nouveau actif depuis juin 2017 et est intégré dans Mesa depuis la version 19, et la partie DRM dans Linux depuis la version 5.2.
Le projet, Panfrost, a pour but de supporter les versions Midgard (T---) and Bifrost (G--) de ces GPU$^,$. Du fait qu'il soit basé sur Gallium, certaines fonctions OpenGL pour bureau sont automatiquement traduites en fonctions OpenGL ES, permettant ainsi de faire fonctionner des applications pour bureau sur architecture Midgard, ce qui n'est pas le cas avec le pilote propriétaire. Il est également intégré dans les versions stables de Mesa depuis le version 19, et la partie DRM dans Linux depuis la version 5.2. Il gère un grand nombre de fonctions OpenGL complet (pas que ES), sans atteindre OpenGL 3.0 en septembre 2019.
De nombreux SoC ARM comportent cependant un GPU PowerVR ou plus rarement d'autres processeurs graphiques (Adreno de Qualcomm, Vivante, Nvidia et VideoCore de Broadcom), qui possèdent tous des pilotes pour Linux. Les pilotes 3D sont présents dans Mesa pour Adreno (Freedreno), Vivante (Etnaviv) et VideoCore (vc4 et vc5), ainsi que nvidia (Nouveau).
L'API générique d'accès au GPU MALI compatible EXA/DRI2 libres à sources ouvertes (licences Apache et MIT) est disponible pour les Mali 200, 300, 400 et 600 sur la plateforme Linux, mais la partie la plus basse d'accès au processeur, dépendant du constructeur reste fermée.
D'autre part le pilote X11 est minimum et un projet alternatif a démontré qu'il est possible d’accélérer en moyenne 3 fois les performances des opérations 3D et jusqu'à 10 fois les opérations géométriques 2D en ajoutant la gestion de certains composants d'X11.

### OpenGL

Bien que le pilote officiel d'ARM ne supporte pas OpenGL, par contre, les pilotes sous licence libres pour Linux, Lima et Panfrost, le supportent (voir section OpenGL ES ci-dessus).

### OpenCL

Le kit de développement OpenCL, appelé « Mali OpenCL SDK », est mis à disposition par ARM pour les GPU T600 et supérieur, il est compatible Linux et Microsoft Windows. Les sources sont disponibles, mais la licence propriétaire. Il faut une licence d'ARM pour pouvoir redistribuer les sources.

### Renderscript

Google Android fournit une API Renderscript compatible avec les pilotes Mali T600 et supérieurs.

### Vulkan

Les processeurs Mali-T760 et supérieur de l'architecture Midgard, ainsi que sur l'ensemble de l'architecture Bifrost, ont des caractéristiques compatibles avec l'API Vulkan 1.0. Les pilotes doivent fonctionner en espace utilisateur, pour Android 7.0 et GNU/Linux, et pour quelques plateformes uniquement$^,$.
Le développement d'un pilote Vulkan open source pour les familles Midgard et Bifrost (Mali-T--- et Mali-G--) appelé PanVk débute en 2021, au sein du projet Mesa3D.

## Les séries
### Mali-55

Le Mali-55 supporte le calcul matériel des fragments et logiciel seulement des vecteurs. Il est compatible avec OpenGL ES 1.1 et OpenVG 1.0

### Utgard - Mali-...

Les processeurs dont le nom comporte l’appellation Mali-... correspondent à l'architecture Utgard.

#### Série Mali-200

La première série, Mali 200, utilisée dans des processeurs tels que le SoC Telechips TCC890x. Le taux de remplissage est d'un pixel par cœur et par cycle d'horloge avec toutefois une limitation lorsque le compteur de vecteurs est saturé, cela donne par exemple pour 1 cœur à 100 MHz, 100 Mpixels/s.

#### Série Mali-300

La seconde série, Mali-300 ne semble pas avoir été intégrée dans des processeurs commercialisés.

#### Série Mali-4..

La troisième série, Mali-400 MP, premier processeur graphique mobile à proposer une architecture multi-cœur est proposée sur des processeurs plus haut de gamme, généralement, contenant un CPU Cortex A9, comme le ST-Ericsson U8500, comme les Samsung Exynos 4, les Amlogic 8726-M et 8726-MX ou les Rockchip RK3188, mais aussi sur des Soc contenant des Cortex A8 Allwinner A1X. Il peut être utilisé en version 1 à 4 cœurs et indépendamment à des fréquences de 200 à 400 MHz. Pour donner un ordre d'idée, un quadruple cœur à 200 MHz, supporte une vitesse de remplissage de 44 mégatriangles par seconde et 800 mégapixels par seconde, conservant ainsi la vitesse de remplissage brut par cœur et cycle d'horloge des Mali 200.
Le Mali-450 MP offre une puissance deux fois supérieure par cœur à celle du Mali-400 MP pour le rendu d'OpenGL ES 2.0 et peut gérer jusqu'à 8 cœurs simultanés. La première implémentation est l'AMLogic AML8726-M8, un SoC fondu en 28 nm par TSMC, contenant 4 cœurs cortex A9 à 2 GHz et 6 cœurs Mali-450 MP et qui devrait être disponible en série à partir du 3e trimestre 2013.
En octobre 2015, ARM annonce le Mali-470, orienté vers les périphériques ultra basse consommation d'habillage (montres, puces que l'on peut coudre dans les vêtements, etc.). Il améliore le Mali-450, principalement au niveau de l'efficacité. Il consomme deux fois moins d'énergie que le Mali-400 à un taux de traitement équivalent. Il ajoute par rapport à ses prédécesseurs un processeur vectoriel, et réduit encore le recalcul de blocs qui n'auraient pas été modifiés.

### Midgard - Mali-T...

Les processeurs dont le nom comporte l’appellation Mali-T... correspondent à l'architecture Midgard.

#### Série Mali-T6..

La série Mali-T600 est à destination des Cortex A15. Elle équipe notamment la série de Samsung Exynos 5. Le premier modèle a été le Mali-T604.
La série des Mali-T600 introduit le calcul flottant 64 bits. Construit sur une conception architecturale multicœur scalable et multi-pipeline et inclus de nombreuses fonctions avancées telles que :
* opération scalaire et vectorielle native pour les types de données flottantes et entières d'OpenCL (dont les 64 bits).
* Support pour la compilation statique et dynamique
* types de données d'image et d'échantillon pour l'accélération matérielle
* opération atomiques rapides
* compatibilité avec la précision requise par la norme IEEE754-2008
* Support d'OpenGL ES 3.0
La série Mali-T6.. apporte également les nouveautés suivantes
* 256+ thread par cœur au lieu de 128 sur les Mali-400 et deux pipes arithmétiques à faible latence.
* Un pipeline avec les 3 principales tâches unifiées.
* L'anticrénelage par suréchantillonnage (MSAA) 4x maintient un taux de remplissage de 90 % et en 16x ne divise que par 4 le taux de remplissage.
* Une gestion de l'énergie améliorée, l'horloge d'un cœur est immédiatement et automatiquement arrêtée lorsque inutilisée et différentes fréquence possible pouvant être géré en automatique ou par le système et compatible avec le contrôle DVFS (Dynamic Voltage and Frequency Scaling).
ARM annonce le 2 août 2012 à Shanghai, rendre au groupe Khronos un test complet de conformité « OpenCL 1.1 Full Profile » pour les processeurs graphiques Mali-T604 afin d'en obtenir la certification. Il s'agit du Full profile à l'intention des ordinateurs de calcul de bureau et non uniquement des applications mobiles ou embarquées (Embedded Profile), démontrant la volonté d'ARM de s'imposer dans tous les domaines.
La seconde génération, inclut les Mali-T622, Mali-T624, Mali-T628, Mali-T678?

#### Série Mali-T7..

La première génération des Mali-T7.., présentée le 29 octobre 2013, est décliné sous deux modèles, tous deux compatibles OpenGL ES 3.0 et DirectX11. Ils sont également compatible OpenCL 1.1 et RenderScript :
* Mali-T720, destiné à remplacer les Mali-300 et Mali-400 MP, en y apportant le support OpenGL ES 3.0 et des performances 2 fois supérieures au Mali-400 MP. Il comporte 8 processeurs de shaders, ainsi que 2 MMU. Il sera notamment adapté au fonctionnement avec les processeurs ARM Cortex-A17 MPCore.
* Le Mali-T760 double le nombre de processeurs de shaders des Mali-T604, en les passant de 8 à 16 et comporte une unité de tuillage avancé, permettant de calculer l'image en rectangle séparés et d'améliorer ainsi l'élimination des polygones inutiles (clipping) ou le traçage de surface n'ayant pas changé.
Le Mali-T760 supporte également l'API Vulkan.

#### Série Mali-T8..

Fin octobre 2014, ARM présente la gamme Mali-T8.., cette nouvelle gamme ajoute le support l'OpenGL ES 3.1, d'OpenCL 1.2 et différentes optimisations rendant le GPU plus efficace au niveau consommation. Le support de l'API Vulkan 1.0 a été ajouté après sa sortie :
* Le Mali-T820 est optimisé pour les produits entrée de gamme et orienté efficacité énergétique
* Le Mali-T830 en milieu de gamme avec un balancement entre efficacité énergétique et performances
* Et enfin, les Mali-T860 et T880 sont surtout orientés vers les performances pures.

### Bifrost - Mali-G..

Les processeurs dont le nom comporte l’appellation Mali-G.. correspondent à l'architecture Bifrost.

#### Mali-G71

ARM annonce en mai 2016 le processeur graphique Mali-G71, utilise l'architecture Bifrost, qui peut être couplé avec le nouveau processeur Cortex-A73 pour des tâches de réalité virtuelle. C'est le premier GPU d'ARM compatible avec l'API Vulkan, l'API étant ensuite porté sur les modèles des séries Mali-T..., mais aucune information n'a été donnée quant au portage sur les Mali-.... Des améliorations ont été faites sur le système de pipeline, sur la granularité des caches, et sur l'élimination des triangles d'une taille inférieur au pixel.

#### Mali-G51

Annoncé en octobre 2016, le Mali-G51 est à destination de la réalité virtuelle et des écrans de résolution plus élevée. Il comporte deux shaders de pixels par cœur graphique, doublant ainsi les taux de texel et pixel par cœur, par rapport au Mali-G71. Il supporte également la compression de tampon d'image ARM (ARM Frame Buffer Compression ou AFBC) 1.2, ainsi que les API Vulkan, OpenGL ES 3.2 et OpenCL 2.0.

#### Mali-G72

Annoncé en mai 2017 (seconde génération Bifrost), le Mali-G72 est destiné à succéder au Mali-G71, les performances générales par rapport à son prédécesseur ont été améliorés de 40%, et l'efficacité énergétique améliorée de 25%.

#### Mali-G76

Annoncé en mai 2018 (troisième génération Bifrost), le Mali-G76 améliore ses performances de 30 % par rapport au G72, et améliore de 2,7 fois l'efficacité en Machine Learning (ML). Il supporte de 4 à 20 cœurs. Chaque cœur comporte trois moteurs et chaque moteur comporte huit voies d’exécution.

### Valhall - Mali-Gxx
#### Mali-G78

Le Mali-G78 est la deuxième génération de l'architecture Valhall.

### Mali-G610

Il fait partie de la 10e génération de processeurs graphiques Mali.
Le GPU Mali-G10 est une importante évolution de la gamme, puisqu'il intègre désormais un microcontrôleur Cortex-M7 pour ordonnancer les tâches vers les différentes unités de traitement. On appelle cet ajout le frontal de flux de commande (anglais : Command Stream Frontend, CSF), ce qui est courant sur les processeurs graphiques géométriques haut de gamme. Les développeurs du pilote libre Panfrost ont forké leur code pour intégrer ces changements sous le nom de « PanCSF » pour intégrer ces changements importants de manière indépendante au pilote Panfrost qui continue de supporter les architectures plus anciennes qui utilisaient un plus simple gestionnaire de tâches (anglais : Job Manager).

## Modèles

Voici la liste actuelle des modèles de cœurs Mali :
| Nom | Max cœurs max. shaders | Max taille Cache niveau 2 | compatibilité API | Architecture | Référence |
| Mali-55 | 1 | - | OpenGL ES 1.1, OpenVG 1.0 | - | |
| Mali-200 | 1 | - | OpenGL ES 1.1 & 2.0, OpenVG 1.1 | Utgard | |
| Mali-300 | 1 | 8 Kio | OpenGL ES 1.1 & 2.0, OpenVG 1.1 | Utgard | |
| Mali-400 MP | 4 | 256 Kio | OpenGL ES 1.1 & 2.0, OpenVG 1.1 | Utgard | |
| Mali-450 MP | 8 | 512 Kio | OpenGL ES 1.1 et 2.0, OpenVG 1.1 | Utgard | |
| Mali-470 | 4 | 8 Kio (L1) 256 Kio (L2) | OpenGL ES 1.1 et 2.0, OpenVG 1.1 | Utgard | |
| Mali-T604 | 4 | 256 Kio | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 1re gén. | $^,$ |
| Mali-T622 | 2 | 256 Kio par cœur | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 1re gén. | |
| Mali-T624 | 4 | 256 Kio | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 2e gén. | $^,$ |
| Mali-T628 | 8 | 256 Kio | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 2e gén. | $^,$ |
| Mali-T658 | 8 | 256 Kio | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 2e gén. | $^,$ |
| Mali-T678 | 8 | 256 Kio | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 2e gén. | $^,$ |
| Mali-T720 | 8 | 64 Kio à 256 Kio selon le nombre de processeurs. | OpenGL ES 1.1, 2.0 et 3.0, OpenVG 1.1, OpenCL 1.1, DirectX 11, Renderscript | Midgard 3e gén. | |
| Mali-T760 | 16 | 256 Kio à 2 Mio (256 à 512 Kio partagé par groupe de 4 cœurs) | OpenGL ES 1.1, 2.0 et 3.0 à 3.2, OpenVG 1.1, Vulkan 1.0 OpenCL 1.1, DirectX 11, Renderscript | Midgard 3e gén. | |
| Mali-T820 | 1 à 4 | 32 Kio à 256 Kio selon le nombre de processeurs. | OpenGL ES 1.1, 2.0, 3.0 à 3.2, Vulkan 1.0 OpenCL 1.1/1.2 Full Profile, DirectX 11 FL9_3, Renderscript | Midgard 4e gén. | |
| Mali-T830 | 1 à 4 | 32 Kio à 256 Kio selon le nombre de processeurs. | OpenGL ES 1.1, 2.0, 3.0 à 3.2, Vulkan 1.0 OpenCL 1.1/1.2 Full Profile, DirectX 11 FL9_3, Renderscript | Midgard 4e gén. | |
| Mali-T860 | 1 à 16 | 256 Kio à 2 Mio selon le nombre de processeurs. | OpenGL ES 1.1, 2.0, 3.0 à 3.2, Vulkan 1.0 OpenCL 1.1/1.2 Full Profile, DirectX 11 FL9_3, Renderscript | Midgard 4e gén. | |
| Mali-T880 | 1 à 16 | 256 Kio à 2 Mio selon le nombre de processeurs (256 à 512 kio / 4 unités de shaders) | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.0 OpenCL 1.1/1.2 Full Profile DirectX 11 FL11_2, Renderscript | Midgard 4e gén. | |
| Mali-G31 très basse conso. | 1 (simple ou double pixel) | 32 Kio à 512 Kio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.0 OpenCL 1.1/1.2/2.0 Full Profile Renderscript | Bifrost | |
| Mali-G51 | 1 à 32 | 128 Kio à 2 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.0 OpenCL 1.1/1.2/2.0 Full Profile DirectX 11 FL11_2, Renderscript | Bifrost | |
| Mali-G52 | 1,2,3,4 ou 6 (dual pixel) | 32 Kio à 512 Kio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.0 OpenCL 1.1/1.2/2.0 Full Profile Renderscript | Bifrost | |
| Mali-G71 | 1 à 32 | 128 Kio à 2 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.0 OpenCL 1.1/1.2/2.0 Full Profile DirectX 11 FL11_2, Renderscript | Bifrost | $^,$ |
| Mali-G72 | 1 à 32 | 128 Kio à 2 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.0 OpenCL 1.1/1.2/2.0 Full Profile DirectX 12 FL11_1, Renderscript | Bifrost | |
| Mali-G76 | 4 à 20 | 512 Kio à 4 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.1 OpenCL 1.1/1.2/2.0 Full Profile | Bifrost | |
| Mali-G77 | 7 à 16 | 512 Kio à 4 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.1 OpenCL 1.1, 1.2, 2.0 Full Profile | Valhall | |
| Mali-G78 | 7 à 24 | 512 Kio à 2 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.1, 1.2 OpenCL 1.1, 1.2, 2.0 Full Profile | Valhall 2e gén. | |
| Mali-G610 | 1 à 6 | 512 Kio à 2 Mio niveau 2 | OpenGL ES 1.1, 2.0, 3.0 à 3.2 Vulkan 1.1, 1.2 OpenCL 1.1, 1.2, 2.0 Full Profile | Valhall 2e gén. | |

## Implémentations

Les différentes variantes du GPU Mali peuvent être trouvées dans les SoC suivants :
| Fabricant | nom du SoC | version de Mali |
| Telechips | TCC8803, TCC8902, TCC8900, TCC9201 | Mali-200$^,$ |
| NetLogic | Au1380, Au1350 | Mali-200$^,$ |
| Socle-Tech | Leopard-6 | Mali-200 |
| STMicroelectronics | SPEAr1340 | Mali-200 |
| Spreadtrum | SC8810, SC6820 | Mali-400 MP1 |
| Amlogic | 8726-M, 8726-MX | Mali-400 MP1/MP2 (1 ou 2 cœurs 400 MHz) |
| Allwinner | A10, A13, R8 | Mali-400 MP1 (1 cœur à 300~400 MHz) |
| Allwinner | A20 | Mali-400 MP2 (2 cœurs) |
| Nufront | Nusmart 2816 | Mali-400 MP |
| Rockchip | RK3188, PX2 | Mali-400 MP4 (4 cœurs) |
| MediaTek | MT6572 | Mali-400 MP (1 cœur) |
| Samsung | Exynos 4210, 4212, 4412 | Mali-400 MP4 (4 cœurs) |
| Samsung | S5P6450 Vega | Mali-400 MP |
| ST-Ericsson | NovaThor U9500, U8500, U5500 | Mali-400 MP |
| STMicroelectronics | STi7108, STiH416 | Mali-400 MP$^,$ |
| WonderMedia | Prizm WM8850, WM8950 | Mali-400 MP |
| WonderMedia | Prizm WM8880, WM8980 | Mali-400 MP2 |
| WonderMedia | Prizm WM8860 | Mali-450 MP |
| Amlogic | S805 | Mali-450 MP2 (2 cœurs) |
| Amlogic | AML8726-M8 | Mali-450 MP4 (4 cœurs) |
| Amlogic | S802, S812 | Mali-450 MP8 (8 cœurs) |
| Samsung | Exynos 5250, 5440 | Mali-T604 MP |
| Samsung | Exynos 5260 | Mali-T624 MP |
| HiSilicon | Kirin 935 | Mali-T628 MP4 (4 cœurs) |
| Samsung | Exynos 5420, 5422, 5800 | Mali-T628 MP6 (6 cœurs) |
| HiSilicon | K3V3 (ou Kirin 910) | Mali-T658 |
| Samsung | Exynos 7580 | Mali-T720 MP2 (2 cœurs) |
| Allwinner | H6 V200 et H6 VC200 | Mali-T720 Mutli-Core$^,$ |
| Rockchip | RK3288 | Mali-T760 MP4 (4 cœurs) |
| MediaTek | MT6732 | Mali-T760 |
| Rockchip | RK3399 | Mali-T860 MP4 (4 cœurs) |
| MediaTek | Helio P20 | Mali-T880 MP2 (2 cœurs) |
| HiSilicon | Kirin 950 | Mali-T880 MP4 (4 cœurs) |
| MediaTek | Helio X20 | Mali-T880 MP4 (4 cœurs) |
| MediaTek | Helio X25 | Mali-T880 MP4 (4 cœurs) |
| Samsung | Exynos 8 Octa 8890 | Mali-T880 MP12 (12 cœurs) |
| HiSilicon | Kirin 960 | Mali-G71 MP8 (8 cœurs) |
| Samsung | Exynos 8895 | Mali-G71 MP20 (20 cœurs) |
| Allwinner | Allwinner H616 | Mali-G31 MP2 (2 cœurs) |
| Rockchip | RK3530 | Mali-G52 |
| HiSilicon | Kirin 970 | Mali-G72 MP12 (12 cœurs) |
| Samsung | Exynos 9810 | Mali-G72 MP18 (18 cœurs) |
| HiSilicon | Kirin 980 | Mali-G76 MP16 (16 cœurs) |
| Samsung | Exynos 9820 | Mali-G76 MP12 (12 cœurs) |
| Samsung | Exynos 990 | Mali-G77 MP11 (11 cœurs) |
| Rockchip | RK3568 | Mali-G52 |
| Rockchip | RK3588 | Mali-G610 MP4 (4 cœurs) |