Debian: quelles instructions utilisent les binarys x86-64?

Je voudrais savoir si les binarys utilisent (sont compilés pour) des jeux d'instructions spéciales comme SSE 4.1 / 4.2, AVX, F16C ou non. Comment puis-je savoir si un binary dans un package utilise certains jeux d'instructions?

Je sais que je peux activer de telles instructions en utilisant configure commutateurs de configure lors de la compilation de packages à la main, mais lors de l'utilisation de packages précompilés à partir du référentiel Debian, il doit y avoir un défaut.

Les binarys ne sont probablement pas compilés avec des sets d'instructions trop spécifiques, car ils ne peuvent pas être utilisés sur un système quelconque ou, selon le binary, ils sont compilés avec des sous-routines alternatives qui «émulent» le traitement avec des instructions basiques.

Je sais que je pourrais regarder dans le file de rules d'un package source Debian mais je suis intéressé s'il y a un moyen plus facile de le faire.

  • Les instructions du processeur utilisées par un binary x86-64 sont-elles très limitées?
  • Les packages de mai utilisent des sets d'instructions assez spécifiques, peuvent-ils avoir des replis en utilisant des instructions plus primitives?

Pour répondre à votre question en général, https://superuser.com/questions/726395/how-to-check-if-a-binary-requires-sse4-or-avx-on-linux donne un script qui peut être alimenté par un désassemblé binary (la sortie de objdump ) et va essayer de comprendre le jeu d'instructions minimum requirejs. Cette technique est nécessairement approximative, car un binary donné peut avoir différents paths d'exécution en fonction du jeu d'instructions disponible, et un tel binary semblerait nécessiter le «meilleur» jeu d'instructions qu'il supporte, même s'il peut effectivement fonctionner sans lui.

En ce qui concerne spécifiquement les packages Debian, tout ce qui est fourni pour amd64 (le jeu d'instructions "PC" 64 bits) doit pouvoir s'exécuter sur n'importe quel processeur compatible AMD64 ou x86-64; cela signifie qu'il peut utiliser le jeu complet d'instructions 64 bits, qui inclut SSE2, mais il ne peut utiliser d'autres fonctionnalités (y compris celles que vous listz) que s'il fournit des replis pour les CPU qui ne les prennent pas en charge. Il y a des exceptions, mais les packages devraient indiquer cela dans la description du package (voir par exemple rr ).

Le kernel Linux lui-même peut adapter ses fonctionnalités à celles du processeur sur lequel il se trouve. S'il est compilé pour x86-64, il suppose qu'il peut utiliser un TSC, CMPXCHG64, CMOV (searchz tout ce qui dépend de X86_64 sur ce lien). Mais il peut être compilé pour vérifier au moment de l'exécution si des fonctionnalités telles que AES-NI, AVX, AVX2 sont disponibles, et les utiliser en particulier pour accélérer les calculs cryptocharts. Cela peut profiter à n'importe quel programme utilisant ces fonctionnalités (au prix de changements de context dans le kernel cependant).

Dans certains cas, l'éditeur de liens dynamic peut également fournir des alternatives en fonction de la CPU: ainsi libc6-i686 fournit un set de bibliothèques pour l'architecture i386 qui sera utilisé automatiquement au lieu des équivalents bare-bone sur les CPU compatibles avec le jeu d'instructions i686 et supportant CMOV).