L’ingénieur Igalia, Tvrtko Ursulin, a récemment soumis un patch au noyau Linux ajoutant une implémentation d’émulation NUMA (Non-Uniform Memory Access) pour les plates-formes arm64 qui peut augmenter les performances des cibles Arm 64 bits en « divisant la RAM physique en morceaux et en utilisant une politique d’allocation pour mieux utiliser le parallélisme dans l’organisation des puces de mémoire physique ».
L’implémentation de l’émulation NUMA a été testée sur un SBC Raspberry Pi 5 et le score monocœur Geekbench 6 s’est amélioré de 6 %, tandis que le score multicœur a augmenté de 18 % après division en quatre nœuds NUMA émulés. En d’autres termes, cela équivaut à avoir un processeur Broadcom BCM2712 overclocké de 2,4 GHz à 2,83 GHz.

Le patch est en fait assez court, environ 100 lignes, et le fichier de code C principal fait environ 60 lignes de long (extrait de l’en-tête SPDX) :
#include #include « numa_emulation.h » static non signé int emu_nodes ; int __init numa_emu_cmdline(char *str) { int ret; ret = kstrtouint(str, 10, &emu_nodes); si (ret) retourne ret ; if (emu_nodes > MAX_NUMNODES) { pr_notice(« numa=fake=%u trop grand, réduit à %u\n », emu_nodes, MAX_NUMNODES); emu_nodes = MAX_NUMNODES ; } renvoie 0 ; } int __init numa_emu_init(void) { phys_addr_t début, fin ; taille longue non signée ; entier non signé i ; int ret; si (!emu_nodes) renvoie -EINVAL ; start = memblock_start_of_DRAM(); end = memblock_end_of_DRAM() – 1; size = DIV_ROUND_DOWN_ULL(fin – début + 1, emu_nodes); taille = PAGE_ALIGN_DOWN(taille); pour (i = 0; i < emu_nodes; i++) { u64 s, e; s = début + i * taille ; e = s + taille - 1 ; if (i == (emu_nodes - 1) && e != end) e = end; pr_info("Faire un nœud à [mem %pap-%pap]\n", &s, &e); ret = numa_add_memblk(i, s, e + 1); if (ret) { pr_err("Échec de l'ajout du faux nœud NUMA %d!\n", i); break; } } return ret; }
|
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#inclure #include « numa_emulation.h » statique int non signé emu_nodes; int __init numa_emu_cmdline(char *str) { int ret; ret = kstrtouint(str, 10, &emu_nodes); si (retraité) retour à la retraite; si (emu_nodes > MAX_NUMNODES) { pr_notice(« numa=fake=%u trop grand, réduit à %u\n », emu_nodes, MAX_NUMNODES); emu_nodes = MAX_NUMNODES ; } retourner 0; } int __init numa_emu_init(void) { phys_addr_t début, fin ; taille longue non signée ; entier non signé i ; int ret; si (!emu_nodes) retour -EINVAL; start = memblock_start_of_DRAM(); end = memblock_end_of_DRAM() – 1; size = DIV_ROUND_DOWN_ULL(fin – début + 1, emu_nodes); taille = PAGE_ALIGN_DOWN(taille); pour (i = 0; i < emu_nodes; i++) { u64 s, e; s = début + i * taille ; e = s + taille – 1 ; if (i == (emu_nodes – 1) && e != fin) e = fin ; pr_info(« Faire semblant d’un nœud à [mem %pap-%pap]\n », &s, &e); ret = numa_add_memblk(i, s, e + 1); si (ret) { pr_err(« Échec de l’ajout du faux nœud NUMA %d!\n », i); casser; } } retour à la retraite; } |
Le code peut être activé à l’aide de la nouvelle option NUMA_EMULATION Kconfig, puis au moment de l’exécution en utilisant l’argument de démarrage du noyau numa=fake= existant (partagé avec d’autres plates-formes). Les utilisateurs devront également mettre en place une politique d’allocation d’entrelacement à l’aide d’un programme de test avec :
numactl –interleave=all COMMAND
|
numactl –interleave=all COMMAND |
Cela concernerait donc un programme spécifique, mais Tvrtko explique également qu’une politique à l’échelle du système pourrait être configurée via systemd.
Bien qu’il n’y ait aucune garantie que les améliorations de référence se répercutent sur l’amélioration globale du système, c’est formidable de bénéficier d’une amélioration « gratuite » des performances. Le patch devra encore passer par quelques itérations, et il n’est toujours pas clair s’il sera accepté, comme Greg l’a répondu :
Pourquoi ne pas simplement décrire correctement la topologie numa dans votre chargeur de démarrage ou votre arborescence de périphériques et ne pas avoir besoin de telles « fausses » choses du tout ?
De plus, vous me demandez maintenant de maintenir ces nouveaux fichiers, ce qui n’est pas du tout quelque chose que je suis à l’aise de faire, désolé.
Le temps nous le dira.
Via Tom’s Hardware et Phoronix
Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

-
1 écusson Marshal des États-Unis, 7 x 5 cm, avec bandes Velcro militaires, application pour sacs à dos, vêtements, sacs, uniforme, gilet
-
Lot de 6 écussons tactiques en caoutchouc - Motif croix rouge - Pour sacs à dos tactiques, sacs médicaux, kits de premiers secours/sac, kits d'aventure en plein air
