web-dev-qa-db-fra.com

comment découvrir la famille d'architecture Intel à partir de la ligne de commande

J'ai accès à certaines machines xeon pour vérifier les performances. Je veux savoir quelle architecture ils utilisent comme Haswell, Sandybridge, Ivybridge. Existe-t-il une commande pour le savoir?

36
a curious engineer

C'est un peu une solution de contournement bon marché mais vous pouvez obtenir ces informations de gcc! Je vais vous expliquer: gcc est capable d'optimiser les binaires pour chaque sous-archivage avec l'option -march. De plus, il est capable de détecter le vôtre et d'optimiser automatiquement pour votre machine avec -march = native En supposant donc, il vous suffit d'appeler gcc avec march = native et de lui demander quels drapeaux il utiliserait: en bref

gcc -march=native -Q --help=target|grep march

pour moi ça donne

-march=                               bdver1

mais mon pc fonctionne avec un processeur buldozer AMD

51
Nephanth

Ces données sont stockées dans PMU_NAME, tapez simplement:

cat /sys/devices/cpu/caps/pmu_name
haswell
18
wuseman

Vous ne pouvez probablement pas car ce sont des noms commerciaux pour la vente commerciale, pas le nom "technique".

Cependant, vous pouvez obtenir ce dont vous avez besoin sur dmidecode, puis visiter http://ark.intel.com (pour votre processeur Xeon) pour déterminer la famille commerciale.

[root@mediasrv ~]# dmidecode|grep -i intel
        Socket Designation: Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
        Manufacturer: Intel
        Version: Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz

À partir de cette sortie, je pouvais visiter le site Web arche d'Intel et rechercher le processeur 3770, ce qui me dirait que j'ai une puce Ivy Bridge.

9
Jason Harris

Remarque: Ce script ne fonctionne plus. L'URL de recherche d'Intel a changé.

Vous trouverez ci-dessous un script bash qui trouve automatiquement le nom de code d'architecture de votre processeur à l'aide de /proc/cpuinfo et https://ark.intel.com/ . Pour fonctionner, vous devez avoir pup installé.

En exécutant le code sur mon ordinateur, j'obtiens le résultat suivant:

$ ./intel_codename
Processor name: i7-7700HQ
Kaby Lake

#!/bin/bash

set -euo pipefail

if [[ $# == 0 ]]; then
    modelname=$(cat /proc/cpuinfo | grep 'model name' | head -1)
    if ! grep Intel <<<"$modelname" > /dev/null; then
        echo "You don't seem to have an Intel processor" >&2
        exit 1
    fi

    name=$(sed 's/.*\s\(\S*\) CPU.*/\1/' <<<"$modelname")
    echo "Processor name: $name" >&2
else
    name=$1
fi

links=($(curl --silent "https://ark.intel.com/search?q=$name" | pup '.result-title a attr{href}'))

results=${#links[@]}
if [[ $results == 0 ]]; then
    echo "No results found" >&2
    exit 1
fi

link=${links[0]}
if [[ $results != 1 ]]; then
    echo "Warning: $results results found" >&2
    echo "Using: $link" >&2
fi

url="https://ark.intel.com$link"
codename=$(curl --silent "$url" | pup '.CodeNameText .value text{}' | xargs | sed 's/Products formerly //')

echo "$codename"
7
Tyilo

Sur le cloud, aucune des réponses ci-dessus ne fonctionne pour moi. J'ai un nom de modèle de "CPU Intel (R) Xeon (R) @ 2.00GHz", dmidecode me dit que Google a fait les processeurs, et cetera.

/ proc/cpuinfo "famille cpu" et "modèle" aident pas mal. Ils sont uniques pour presque toutes les combinaisons et peuvent être consultés sur https://en.wikichip.org/wiki/intel/cpuid . Cependant, le modèle 85 de la famille 6 est à la fois un puits de lumière et un lac en cascade.

1
Bryan Larsen

Vous avez tenté de corriger le script que @Tyilo avait publié plus tôt. La version mise à jour est ci-dessous.

#!/bin/bash

set -euo pipefail

if [[ $# == 0 ]]; then
    modelname=$(cat /proc/cpuinfo | grep 'model name' | head -1)
    if ! grep Intel <<<"$modelname" > /dev/null; then
        echo "You don't seem to have an Intel processor" >&2
        exit 1
    fi

    name=$(sed 's/.*CPU\s\(.*\)\s\(@\).*/\1/' <<<"$modelname")
    echo "Processor name: $name" >&2
    name=${name// /'%20'}
else
    name=$1
fi

links=($(curl --silent "https://ark.intel.com/content/www/us/en/ark/search.html?_charset_=UTF-8&q=$name" | pup '#FormRedirectUrl attr{value}'))

results=${#links[@]}
if [[ $results == 0 ]]; then
    echo "No results found" >&2
    exit 1
fi

link=${links[0]}
if [[ $results != 1 ]]; then
    echo "Warning: $results results found" >&2
    echo "Using: $link" >&2
fi

url="https://ark.intel.com$link"
codename=$(curl --silent "$url" | pup 'span[data-key="CodeNameText"] text{}' | xargs | sed 's/Products formerly //')

echo "$codename"

En exécutant le script mis à jour sur mon serveur, j'obtiens le résultat suivant:

$ ./intel_codename 
Processor name: E3-1225 v5
Skylake

Pas du tout un expert. Je viens d'apprendre à utiliser curl et chiot au cours de la dernière heure. Je ne l'ai pas testé sur d'autres sauf ma propre machine.

pdate: A fait quelques tests supplémentaires. Le script devrait fonctionner pour Xeon Famille de processeur. Cependant, il se casse (montrant Aucun résultat trouvé) si la requête de base de données Intel Ark renvoie plusieurs résultats. Par exemple pour Xeon Platinum 8260, il renverra 8260 et toutes ses variantes telles que 8260M. De plus, si le nom (numérotation du processeur) est utilisé dans d'autres produits ou champs de données clés, plusieurs résultats seront renvoyés par la requête et le script ne trouvera pas le résultat. Il casse également pour les processeurs de la version 0, tels que le Xeon E5-2690 0.

Pour la famille de processeurs Intel Core (i7, i5, etc.), vous devez remplacer la commande sed par la commande d'origine par @Tyilo, voir ci-dessous.

name=$(sed 's/.*\s\(\S*\) CPU.*/\1/' <<<"$modelname")

Encore une fois, si la requête renvoie plusieurs résultats. Ce script simple ne sera pas en mesure d'analyser correctement et donne Aucun résultat trouvé.

0
Gyp Sud

Je travaille actuellement sur un serveur. Mon script fonctionne sur au moins des serveurs plus récents. Faire la différence entre les serveurs skylake et cascade lake n'est pas joli ... il utilise le champ 'proc model'/proc/cpuinfo pour taquiner skylake vs cascade lake.

#!/bin/bash
# cascade lake 2nd gen stuff from https://www.intel.com/content/www/us/en/products/docs/processors/xeon/2nd-gen-xeon-scalable-spec-update.html
# 2nd gen xeon scalable cpus: cascade lake sku is 82xx, 62xx, 52xx, 42xx 32xx W-32xx  from https://www.intel.com/content/www/us/en/products/docs/processors/xeon/2nd-gen-xeon-scalable-spec-update.html
# skylake 1st gen stuff from https://www.intel.com/content/www/us/en/processors/xeon/scalable/xeon-scalable-spec-update.html
# 1st gen xeon scalable cpus: 81xx, 61xx, 51xx, 81xxT, 61xxT 81xxF, 61xxF, 51xx, 41xx, 31xx, 51xxT 41xxT, 51xx7, 
CPU_NAME=`cat /proc/cpuinfo | awk '
  function decode_fam_mod(vndor, fam, mod, mod_nm) {
    if (vndor == "GenuineIntel") {
      # cpuid tables from https://en.wikichip.org/wiki/intel/cpuid
      dcd[1,1]="Ice Lake";              dcd[1,2] ="Family 6 Model 108";
      dcd[2,1]="Ice Lake";              dcd[2,2] ="Family 6 Model 106";
      dcd[3,1]="Cascade Lake/Skylake";  dcd[3,2] ="Family 6 Model 85"; # 06_55h  Intel always does the hex fam_model
      dcd[4,1]="Broadwell";             dcd[4,2] ="Family 6 Model 79"; # 06_4fh
      dcd[5,1]="Broadwell";             dcd[5,2] ="Family 6 Model 86"; # 06_56h
      dcd[6,1]="Haswell";               dcd[6,2] ="Family 6 Model 63"; # 06_3fh
      dcd[7,1]="Ivy Bridge";            dcd[7,2] ="Family 6 Model 62";
      dcd[8,1]="Sandy Bridge";          dcd[8,2] ="Family 6 Model 45"; # 06_2dh
      dcd[9,1]="Westmere";              dcd[9,2] ="Family 6 Model 44";
      dcd[10,1]="EX";                   dcd[10,2]="Family 6 Model 47";
      dcd[11,1]="Nehalem";              dcd[11,2]="Family 6 Model 46";
      dcd[12,1]="Lynnfield";            dcd[12,2]="Family 6 Model 30";
      dcd[13,1]="Bloomfield, EP, WS";   dcd[13,2]="Family 6 Model 26";
      dcd[14,1]="Penryn";               dcd[14,2]="Family 6 Model 29";
      dcd[15,1]="Harpertown, QC, Wolfdale, Yorkfield";  dcd[15,2]="Family 6 Model 23";
      str = "Family " fam " Model " mod;
      #printf("str= %s\n", str);
      res=" ";
      for(k=1;k <=15;k++) { if (dcd[k,2] == str) {res=dcd[k,1];break;}}
      if (k == 3) {
        # so Cooper Lake/Cascade Lake/SkyLake)
        if (match(mod_nm, / [86543]2[0-9][0-9]/) > 0) { res="Cascade Lake";} else
        if (match(mod_nm, / [86543]1[0-9][0-9]/) > 0) { res="Skylake";}
      }
      return res;
    }
  }
  /^vendor_id/ {
    vndr=$(NF);
  }
  /^cpu family/ {
    fam=$(NF);
  }
  /^model/ {
    if ($2 == ":") {
      mod=$(NF);
    }
  }
  /^model name/ {
#model name : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
    n=split($0, arr, ":");
    mod_nm = arr[2];
    #printf("vndr= %s, fam= %s, mod= %s, mod_nm= %s\n", vndr, fam, mod, mod_nm);
    cpu_name=decode_fam_mod(vndr, fam, mod, mod_nm);
    printf("%s\n", cpu_name);
    exit;
  }
'`
echo "cpu uarch= $CPU_NAME"

Cela ne gère pas le processeur client ... mais il devrait être relativement simple de prendre les informations du processeur client de WikiChip et d'élargir la liste.

0
patinnc