Le patch d’émulation NUMA améliore les résultats du benchmark Geekbench 6 jusqu’à 18 % sur Raspberry Pi 5

Raspberry Pi 5 NUMA emulation

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.

Émulation Raspberry Pi 5 NUMA

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) :

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

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 :

YouTube video

  • 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