私のCPUがx86-64-v2をサポートしていることをどうやって確認しますか?

私のCPUがx86-64-v2をサポートしていることをどうやって確認しますか?

AMD、Intel、Red Hat、SUSEは以下を定義します。x86-64 CPUの「アーキテクチャレベル」。たとえば、x86-64-v2これはCPUがデフォルトのx86-64命令セットをサポートするだけでなく、SSE4.2、SSSE3、またはPOPCNTなどの他の命令もサポートすることを意味します。

私のCPUがどのアーキテクチャレベルをサポートしているかをどうやって確認しますか?

答え1

これは以下に基づいています。ジオレの答え;フルスクリプトはAWKで書くこともできます。

#!/usr/bin/awk -f

BEGIN {
    while (!/flags/) if (getline < "/proc/cpuinfo" != 1) exit 1
    if (/lm/&&/cmov/&&/cx8/&&/fpu/&&/fxsr/&&/mmx/&&/syscall/&&/sse2/) level = 1
    if (level == 1 && /cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/) level = 2
    if (level == 2 && /avx/&&/avx2/&&/bmi1/&&/bmi2/&&/f16c/&&/fma/&&/abm/&&/movbe/&&/xsave/) level = 3
    if (level == 3 && /avx512f/&&/avx512bw/&&/avx512cd/&&/avx512dq/&&/avx512vl/) level = 4
    if (level > 0) { print "CPU supports x86-64-v" level; exit level + 1 }
    exit 1
}

また、ベースライン(ここでは「レベル1」)を確認し、サポートされている最高レベルのみを出力し、サポートされていない最初のレベルと一致する終了コードで終了します。

答え2

元のコピー場所https://gitlab.archlinux.org/archlinux/rfcs/-/merge_requests/2/diffs

glibc 2.33以降(Arch Linux、Debian 12、Ubuntu 21.04、Fedora 34など)またはパッチ付きglibc(RHEL 8)を使用すると、次のコマンドを実行してCPUのサポートされているアーキテクチャを表示できます。

$ /lib/ld-linux-x86-64.so.2 --help

Subdirectories of glibc-hwcaps directories, in priority order:
  x86-64-v4
  x86-64-v3 (supported, searched)
  x86-64-v2 (supported, searched)

Debian派生製品ではパスが異なるため/lib64/ld-linux-x86-64.so.2 --help

答え3

Linuxでは確認できます。報告されたCPU性能/proc/cpuinfoに記載されている要件に従ってx86-psABIドキュメント

次のスクリプトはプロセスを自動化します(終了コードはサポートされていない最初のアーキテクチャレベルの番号です)。

#!/bin/sh -eu

flags=$(cat /proc/cpuinfo | grep flags | head -n 1 | cut -d: -f2)

supports_v2='awk "/cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/ {found=1} END {exit !found}"'
supports_v3='awk "/avx/&&/avx2/&&/bmi1/&&/bmi2/&&/f16c/&&/fma/&&/abm/&&/movbe/&&/xsave/ {found=1} END {exit !found}"'
supports_v4='awk "/avx512f/&&/avx512bw/&&/avx512cd/&&/avx512dq/&&/avx512vl/ {found=1} END {exit !found}"'

echo "$flags" | eval $supports_v2 || exit 2 && echo "CPU supports x86-64-v2"
echo "$flags" | eval $supports_v3 || exit 3 && echo "CPU supports x86-64-v3"
echo "$flags" | eval $supports_v4 || exit 4 && echo "CPU supports x86-64-v4"

答え4

x86-64-levelここの提案に基づいてツールを作成しました。例:

$ x86-64-level
3

$ level=$(x86-64-level)
$ echo "x86-64-v${level}"
x86-64-v3

## Output an explanation to stderr
$ x86-64-level --verbose
Identified x86-64-v3, because x86-64-v4 requires 'avx512f', which
is not supported by this CPU [Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz]
3

現在のシステムが特定のx86-64レベルをサポートしていることをシェルスクリプトで確認するには、ゲートキーパーに次の行を追加します。

x86-64-level --assert=4 || exit 1

ホストがx86-64-v4をサポートしている場合、このコマンドは実行されず、そうでない場合は次のものが出力されます。

The CPU [Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz] on this host ('dev2')
supports x86-64-v3, which is less than the required x86-64-v4

終了値 1 で終了します。

このx86-64-levelツールは、以下で利用可能なスタンドアロンのBashスクリプトです。https://github.com/HenrikBengtsson/x86-64-level

関連情報