Eh bien, ils apportent (devraient apporter au moins) une grande augmentation de la performance, n'est-ce pas? p>
Alors, je n'ai pas vu de sources de noyau Linux, mais j'adore demander: Sont-ils utilisés d'une manière ou d'une autre? (Dans ce cas - il doit y avoir un "capuchon de code" spécial pour le système qui n'a pas de telles instructions?) P>
4 Réponses :
Les ensembles d'instructions SSE et MMX ont une valeur limitée en dehors des travaux audio / vidéo et de jeu. Vous pourriez trouver quelques utilisations explicites dans les coins sombres du noyau, mais je ne compterais pas dessus. La réponse dans l'affaire Général est "non, elles ne sont pas utilisées", ni utilisées dans la plupart des applications non-noyau / utilisatricesPace. P>
Le noyau utilise parfois certaines instructions X86 spécifiques à certains processeurs (par exemple, présentes sur certains modèles AMD ou Intel mais pas toutes, ni vice-versa), telles que Après la réponse de Mark, je suis allé chercher. Le seul endroit où je pourrais facilement les identifier est utilisé est dans la bibliothèque RAID 6 (qui est également prise en charge d'Altivec, qui est l'ensemble d'instructions SIMD PowerPC). P>
(Soyez méfiant simplement grepping the arbre, il y a beaucoup de taches où le noyau "sait" à propos de SSE / MMX pour prendre en charge les applications de l'espace utilisateur, mais ne l'utilise pas réellement. Aussi quelques cas de noms de variables malheureux qui n'ont absolument rien à voir avec SSE, par exemple dans la mise en œuvre SCTP.) p> syscall code>, mais ces sont différents des ensembles d'instructions SIMD que vous faites référence et ne font pas partie d'un ensemble plus large d'extensions à thème similaire. p>
Mais ce n'est que les endroits du noyau où les instructions de SIMD sont explicitement utilisées. Si je compile moi-même le noyau, y a-t-il une raison pour laquelle je ne devrais pas utiliser le -ftree-vectoriser code> et
-msi * code> options pour indiquer à GCC d'utiliser SIMD où il voit ajuster?
@ US2012 C'est probablement une très mauvaise idée si, sans autre raison que celle-ci, le noyau n'est pas conçu pour cela, et que vous pouvez utiliser de manière inattendue les valeurs d'enregistrement SIMD de l'espace utilisateur de l'espace utilisateur (ou de l'espace utilisateur peut cliquer des valeurs laissées là-bas par le code du noyau) . Message avec les drapeaux de compilation du noyau est généralement une mauvaise idée, il a tendance à briser des choses, que ce soit en allumant des bugs de GCC obscur, soit de casser des hypothèses de bas niveau. Sauf si vous faites de la recherche, les choix de drapeau de compilation sont mieux laissés au noyau Devs. Vous ne voulez pas jouer avec eux, essayez simplement de presser plus de performances de votre système.
Merci! J'ai totalement oublié les registres. Ça a du sens.
@ US2012 Voici une proposition de l'utiliser pour [memcpy] ( Phoronix.com/scan .php? Page = News_Item & px = OTGWMQ ). En général, cela ne serait approprié que pour la copie de grandes quantités de données, mais peut produire une augmentation de la performance de ces cas. Sur une note connexe, NVIDIA a parrainé des recherches sur le fait de procéder à un cryptage (in-noyau) sur leur GPU qui a montré des résultats prometteurs, mais est totalement exclusif et ne le fera jamais dans la ligne principale de sa forme actuelle. Pourtant, cela a démontré les possibilités.
Ils sont utilisés dans le noyau pour quelques choses, telles que p>
Cependant, je crois que cela vérifie toujours leur présence en premier. P>
Il existe de graves restrictions à l'aide de registres vecteurs et de registres de points flottants dans le code du noyau. Voir par exemple Chapitre 6.3 de "Conventions d'appel pour différents compilateurs C ++ et systèmes d'exploitation". http://www.agner.org/optimize/#manuels p>
"CPU SIMD Instructions Utilisez FPU" P>
erm, non, pas comme je le comprends. Ils sont en partie un remplacement moderne et (beaucoup) de remplacement plus efficace des instructions FPU, mais une grande partie de l'instruction SIMD se termine les opérations entière. Je n'ai jamais regardé très fort, mais je suppose (ok, espoir) que le code SIMD généré par une version récente de GCC n'excliquera aucun registre ou État. P>
Le noyau devs décrit de cette façon, car Linux enregistre / restaure l'état du vecteur et du registre FPU ensemble. Les REG vectorielles sont juste regroupés avec le FPU Regs. Code SSE I> CLOBBER Certains des registres SSE (XMM0-XMM15). C'est inévitable.
Dans la mesure où je comprends bien, la plupart de ces instructions sont orientées autour de matrix mathématiques, de DSP, de codage graphique / décodage, etc. Combien de ce que vous attendez-vous sur le noyau?
@Damien_the_unbeliever: Vous pouvez utiliser des instructions SSE pour rechercher un bitfield pour une entrée non nulle ou non 128b à la fois, au lieu de 32 ou 64. Je suis sûr qu'il y a beaucoup d'usages où il serait au moins un petit ScopeUp dans le noyau, à l'exception du fait que l'épargne / restaurer le vecteur Regs est cher.