私はちょうど低レベルの言語について少し学び、gccが-marchおよび-mtuneパラメータを指定して特定のCPUファミリに合わせてソフトウェアを最適化できることを知りました。
ところで、このようなことを言う人もいました。ソースからプログラムをビルドすることは、バイナリをダウンロードするよりもはるかに高速ではありません。。システムのCPUに最適化できるソフトウェアは、確かに速度を大幅に向上させます。特にffmpeg
AVXのようにマイクロアーキテクチャにかなり依存する機能を使用するソフトウェアの場合はさらにそうです。
私が知りたいのは、パッケージマネージャのバイナリが何らかの方法で複数のマイクロアーキテクチャに最適化されていることです。パッケージマネージャは私のシステムのマイクロアーキテクチャに関連するバイナリをダウンロードしますか?
答え1
分布は所定のベースラインに従って構築されます(参照:Debian のアーキテクチャベースライン例えば)。したがって、Debianでは、amd64
パッケージはSSE2を搭載した汎用x86-64 CPUを対象としていますが、SSE3以降ではないi386
MMXまたはSSEを持たない汎用i686 CPUを対象としています。通常、コンパイラのデフォルト値が使用されるため、コンパイラ自体が進化するにつれて調整も進化する可能性があります。
しかし、CPU 固有の最適化が大きな利点を提供するパッケージを構築することで、最新の CPU を活用できます。これは、コンパイラの最適化に頼るのではなく、複数の実装を提供し、実行時に実装から選択することによって行われます。パッケージ化されたソフトウェアは、実行中のCPUを検出し、それを利用するために使用するコードパスを調整します(例を参照ffmpeg
)libswscale/x86/swscale.c
。一部のアーキテクチャではld.so
自分で役に立ちます。可能であれば、最適化されたライブラリを自動的にロードします。例えばi386
SSE対応CPUで動作するアーキテクチャシステムで。
ほとんどのパッケージマネージャはこれらすべてを認識しておらず、特定のアーキテクチャのパッケージをダウンロードしてシステムを実行しているCPUに関係なくインストールします。