2013-10-17 2 views
3

Je sais qu'il est généralement recommandé d'utiliser -march = natif (si vous compilez pour la machine sur laquelle vous vous trouvez), afin que gcc détermine votre arch et cputype et génère le code le plus spécifique à la machine, mais comment fais ça? Utilise-t-il cpuid (sur chaque bras ou sur x86)? Quelles techniques sont utilisées sur les plates-formes sans instruction cpuid-like?Comment gcc détermine -march = native sur x86? Sur le bras?

Répondre

2

Bonne question.

Mon intuition était qu'il irait vérifier /proc/cpuinfo. En fait, cela dépend de l'architecture sur laquelle il a été compilé. Il semble que host_detect_local_cpu est la fonction responsable de cela. Son travail est de remplacer -march=native soit par le bon -march=<...> ou un ensemble de drapeaux (-mmmx, -mno-avx, etc) qui correspondent le plus possible le CPU actuel. Exemples pour i386 et arm. i386 utilise cpuid directement pour vérifier chaque fonctionnalité possible. arm vérifie dans /proc/cpuinfo pour la ligne CPU part et a une table qui mappe d'une valeur de pièce de CPU à une génération de l'architecture et l'utilise directement dans -march=<...>. Juste pour le plaisir, je vérifie d'autres architectures (je ne les connais pas).

  • solaris sur sparc: utilise l'interface kstat
  • linux sur sparc: utilise /proc/cpuinfo
  • alpha: utilise la implver instruction
  • darwin sur rs6000: utilise l'appel système hw.cpusubtype
  • freebsd sur rs6000 : utilise codé en dur powerpc
  • linux sur rs6000: contrôles dans /proc/self/auxv pour la valeur de la plate-forme dans l'interpréteur Elf de son propre processus
  • aix sur rs6000: utilise _system_configuration (apparemment une structure globale)
Questions connexes