Ils ont proposé d'inclure dans le noyau Linux une implémentation jusqu'à 4 fois plus rapide de memchr

Récemment une proposition pour le noyau Linux a été publiée, dans lequel il est proposé d'inclure un ensemble de correctifs avec un implémentation optimisée de la fonction memchr() utilisé pour rechercher un caractère dans un tableau.

La fonction memchr() analyse les n octets de tête de la zone mémoire pointée par s pour la première instance de c. C et les octets de la zone de mémoire pointée par s sont interprétés comme des caractères non signés.

La proposition promet Être plus rapide pour localiser un caractère dans un bloc de mémoire. Dans les tests de développement, la nouvelle implémentation peut être presque quatre fois plus rapide sur les recherches volumineuses

Contrairement à la version précédente, qui utilisait une comparaison octet par octet, l'implémentation proposée est créée en tenant compte de l'utilisation complète des registres CPU 64 bits et 32 ​​bits. Au lieu d'octets, la comparaison est effectuée à l'aide de mots machine, ce qui permet de comparer au moins 4 octets à la fois.

Cette série de correctifs a optimisé "memchr()" et ajouté une macro pour
"memchr_inv()" afin que les deux fonctions puissent l'utiliser pour générer un masque de bits.

L'implémentation originale de "memchr()" est basée sur la comparaison d'octets,
qui n'utilise pas entièrement le registre 64 ou 32 bits du CPU. Nous mettons en place un
comparaison par mots afin qu'au moins 4 octets puissent être comparés au même
Météo. Le memchr() optimisé est presque 4 fois plus rapide que l'original
pour les longues chaînes. Dans le noyau Linux, nous constatons que la longueur de la chaîne
recherché par "memchr()" est jusqu'à 512 octets dans drivers/misc/lkdtm/heap.c.

Lors de la recherche sur de grandes chaînes, la nouvelle version s'est avérée être environ 4 fois plus rapide que l'ancienne (par exemple, pour des chaînes de 1000 caractères). Pour les petites chaînes, l'efficacité de la nouvelle implémentation n'est pas aussi importante, mais elle est toujours supérieure à la version originale.

La chose intéressante à propos de la nouvelle proposition est l'amélioration pour les grandes chaînes, ce qui améliore considérablement les temps. Il convient de mentionner que dans le noyau Linux, la taille des chaînes traitées dans memchr() atteint 512 octets. Dans nos tests, le gain de performances pour les chaînes de 512 octets, dans une situation où le caractère de recherche est à la fin de la chaîne, il est de 20%.

Il convient de mentionner que la version originale de memchr() est implémentée avec la technique de comparaison par octet, qui n'utilise pas entièrement les registres du processeur 64 bits ou 32 bits.

Nous utilisons la comparaison de mots entiers afin que 8 caractères puissent être comparés en même temps sur le CPU. Ce code est basé sur l'implémentation de David Light.

Nous créons deux fichiers pour mesurer les performances du premier fichier qui contient en moyenne 10 caractères avant le caractère de destination. Le second fichier contient au moins 1000 caractères avant le personnage cible.

Notre implémentation de "memchr()" est légèrement meilleur au premier test et presque 4 fois plus rapide que l'original mise en œuvre dans le deuxième test.

Test du noyau 5.18 avec la nouvelle variante "memchr()" pour les architectures 32 bits et 64 bits n'a révélé aucun problème.

Que se passe-t-il si p n'est pas aligné sur 8 octets (ou 4 sur les cibles 32 bits) ? Toutes les cibles ne prennent pas en charge les charges non alignées (efficaces), n'est-ce pas ?
 Je pense que cela fonctionne si p n'est pas aligné sur 8 ou 4 octets. Disons que la chaîne est de 10 octets. La boucle for ici recherchera les 8 premiers octets. Si le caractère de destination est dans les 2 derniers octets, la deuxième boucle for le trouvera. Cela fonctionne également comme ceci sur les machines 32 bits.

Gain de performance global pas encore évalué des sous-systèmes du noyau lors de l'utilisation de la variante optimisée "memchr()", et il n'a pas non plus été question de remplacer l'implémentation (l'appel de la fonction memchr() se produit 129 fois dans le code du noyau, y compris les pilotes et les systèmes de fichiers).

Enfin Si vous souhaitez en savoir plus, vous pouvez vérifier les détails dans le lien suivant.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.