バイナリがSSE 4.1/4.2、AVX、F16Cなどの特殊命令セットを使用(コンパイル)するかどうかを知りたいです。パッケージのバイナリが特定の命令セットを使用しているかどうかを確認する方法は?
パッケージを手動でコンパイルするときにスイッチを使用してこれらのディレクティブを有効にすることはできますが、configure
Debianリポジトリでプリコンパイルされたパッケージを使用する場合はデフォルト値が必要です。
バイナリはどんなシステムでも動作しないので、あまりにも具体的な命令セットにコンパイルされないかもしれませんし、バイナリによっては、これらの機能が不足しているCPUをサポートするために基本命令処理を「シミュレート」する代替サブルーチンにコンパイルされるかもしれません。能力。
私はrules
Debianソースパッケージのファイルを見ることができることを知っていますが、これを行うより簡単な方法があるかどうか疑問に思います。
- x86-64バイナリは非常に限られたCPU命令を使用しますか?
- パッケージは非常に具体的な命令セットを使用できますが、より原始的な命令を使用できますか?
答え1
あなたの質問に一般的に答えるには、https://superuser.com/questions/726395/how-to-check-if-a-binary-requires-sse4-or-avx-on-linux逆アセンブルされたバイナリ(の出力objdump
)を入力として使用し、必要な最小限のコマンドセットを見つけようとするスクリプトが提供されています。指定されたバイナリは使用可能な命令セットに応じて異なる実行パスを持つことができ、これらのバイナリは実際には命令セットなしで実行できますが、サポートする「最適な」命令セットを必要とするように見えるため、この手法はおおよそのものです。
具体的には、Debianパッケージに関してamd64
(64ビットの「PC」コマンドセット)、パッケージ化されたすべてのエントリは、すべてのAMD64またはx86-64準拠のCPUで実行できる必要があります。これは意味するSSE2を含む標準の64ビット命令セット全体を使用できますが、その機能をサポートしていないCPUに代替機能を提供する場合は、他の機能(熱い機能を含む)のみを使用できます。例外がありますが、パッケージの説明にパッケージを指定する必要があります(例:rr
)。
Linuxカーネル自体は、実行中のCPUのパフォーマンスに合わせて機能を調整できます。 x86-64用にコンパイルされた場合仮説X86_64
TSC、CMPXCHG64、およびCMOV(そのリンクに依存するすべての項目を検索)で機能します。ただし、AES-NI、AVX、AVX2などの機能が利用可能かどうかを実行時に確認し、特に暗号化計算を高速化するためにそれらを使用するようにコンパイルできます。これは、これらの機能を使用するすべてのプログラムに役立ちます(コンテキストをカーネルに変換するコストとして)。
場合によっては、動的リンカーがCPUベースの代替を提供するのに役立ちます。libc6-i686
i386
アーキテクチャには、命令セットと互換性があり、CMOVをサポートするCPUのデフォルト等価物の代わりに自動的に使用されるライブラリセットが用意されています。i686