web-dev-qa-db-ja.com

コマンドラインからIntelアーキテクチャファミリを見つける方法

一部のxeonマシンにアクセスしてパフォーマンスを確認します。 Haswell、Sandybridge、Ivybridgeなど、彼らが使用しているアーキテクチャを調べたいと思います。これを見つけるコマンドはありますか?

36

それは少し安価な回避策ですが、その情報をgccから取得できます!説明します。gccは-marchオプションを使用して各サブアーチのバイナリを最適化できます。さらに、それを検出して-march = nativeを使用してマシンに自動的に最適化できると仮定すると、gccをmarch = nativeで呼び出して、どのフラグを使用するかを尋ねるだけです。

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

私にとっては

-march=                               bdver1

私のPCはAMDブルドーザープロセッサで動作します

51
Nephanth

このデータはPMU_NAMEに保存され、次のように入力します。

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

それらは商業的な販売のためのマーケティング名であり、「技術的な」名前ではないため、おそらくできません。

ただし、必要なものをdmidecodeから取得し、 http://ark.intel.com (ご使用のXeonプロセッサー用)にアクセスして、商用ファミリーを判別できます。

[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

その出力から、Intelのark Webサイトにアクセスして3770 CPUを検索すると、Ivy Bridgeチップを持っていることがわかります。

9
Jason Harris

注:このスクリプトは動作しなくなりました。 Intelの検索URLが変更されました。

以下は、/proc/cpuinfoおよび https://ark.intel.com/ を使用してCPUのアーキテクチャコード名を自動的に検出するbashスクリプトです。動作させるには pup がインストールされている必要があります。

コンピュータでコードを実行すると、次の結果が得られます。

$ ./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

クラウドでは、上記の答えはどれも私にとってはうまくいきません。 「Intel(R)Xeon(R)CPU @ 2.00GHz」というモデル名があります。dmidecodeは、Googleがプロセッサなどを製造したことを教えてくれます。

/ proc/cpuinfo "cpu family"と "model"はかなり役立ちます。これらはほとんどすべての組み合わせで一意であり、 https://en.wikichip.org/wiki/intel/cpuid で検索できます。ただし、ファミリー6モデル85はスカイレイクとカスケードレイクの両方です。

1
Bryan Larsen

@Tyiloが以前に投稿したスクリプトを修正しようとしました。更新されたバージョンは以下のとおりです。

#!/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"

サーバーで更新されたスクリプトを実行すると、次の結果が得られます。

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

まったく専門家ではありません。この1時間ほどでcurlとpupの使い方を学びました。私のマシン以外ではテストしていませんでした。

pdate:テストをさらに行いました。スクリプトはXeonプロセッサフ​​ァミリで機能します。ただし、Intel Arkデータベースクエリが複数の結果を返す場合、結果は表示されません(結果が見つかりません)。たとえば、Xeon Platinum 8260の場合、8260および8260Mなどのすべてのバリアントが返されます。また、名前(プロセッサの番号付け)が他の製品または主要なデータフィールドで偶然使用された場合、クエリから複数の結果が返され、スクリプトは結果を見つけられません。また、Xeon E5-2690 0などのバージョン0プロセッサでは機能しません。

Intel Coreプロセッサフ​​ァミリ(i7、i5など)の場合、sedコマンドを@Tyiloによる元のコマンドに置き換える必要があります。以下を参照してください。

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

繰り返しになりますが、クエリが複数の結果を返す場合。この単純なスクリプトは、正しく解析できず、結果が見つかりません。

0
Gyp Sud

私は現在サーバーランドで働いています。私のスクリプトは少なくとも最近のサーバーで動作します。スカイレイクとカスケードレイクサーバーを区別するのは簡単ではありません.../proc/cpuinfoの「モデル名」フィールドを使用して、スカイレイクとカスケードレイクを区別します。

#!/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"

これはクライアントcpusを処理しません...しかし、クライアントのcpuid情報を WikiChip から取得してリストを展開することは比較的簡単です。

0
patinnc