CPU_FLAGS_*
CPU_FLAGS_* は、CPU の命令セットや他の特殊機能を含む USE_EXPAND 変数です。現在 Gentoo は CPU_FLAGS_X86 (amd64 および x86 アーキテクチャ向け)、CPU_FLAGS_ARM (arm および arm64 アーキテクチャ向け)、および CPU_FLAGS_PPC (ppc および ppc64 アーキテクチャ向け) をサポートしています。
さらなる情報については、Gentoo ハンドブックの CPU_FLAGS_* の節を参照してください。
CFLAGS と CPU_FLAGS_* の違い
よくある質問は、「CFLAGS と CPU_FLAGS_X86 などの違いは何ですか?」というものです。
CPU_FLAGS_* は USE_EXPAND の一例です。これは、ebuild 内でビルドシステムに渡される特定のオプションを有効化します。例えば、CPU_FLAGS_X86_SSE2
がパッケージで定義されていれば、このオプションは手書きされた ASM を有効化するでしょう。これらのオプションは、パッケージ内にすでに存在する特定のコードを有効化します。
一方で CFLAGS は単に、可能であればそのような命令を使用するコードの生成しようとすることが許可されることを、コンパイラに伝えるために使用されます。そのような生成が成功するとは限りません。CFLAGS に例えば -msse2
を設定しても、コンパイラは特定の関数のために SSE2 を生成できるほど賢くないかもしれません。これらのオプションは、特定の命令を含む特定のコードの生成を、単にコンパイラに許可するだけです。
そのため、パッケージの最高のパフォーマンスを得るには CPU_FLAGS_* を適切に設定するのが重要です。
設定
これらの変数を、/etc/portage/package.use 内のファイル内で CPU_FLAGS_X86 (CPU_FLAGS_ARM、CPU_FLAGS_PPC) 変数として設定する必要があります:
# これはただの例です。各システムでの適切な値を得るには、'cpuid2cpuflags' ツールを実行してください!
*/* cpu_flags_x86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3
疑問に思うことがあった場合には、app-portage/gentoolkitのequery usesのような一般的なツールを利用してフラグの説明を調べてください。
user $
equery uses media-video/ffmpeg
ほとんどのフラグ名は /proc/cpuinfo での名前と一致します。注目すべき例外が sse3
で、これは /proc/cpuinfo では pni
と呼ばれています(また、これを別物である ssse3
と混同しないでください。)。
cpuid2cpuflags を使用する
app-portage/cpuid2cpuflags は、使用中の CPU アーキテクチャに対応する正しい CPU_FLAGS_ USE_EXPAND 変数を決定する助けになります。
Emerge
root #
emerge --ask app-portage/cpuid2cpuflags
呼び出し
user $
cpuid2cpuflags
CPU_FLAGS_X86: mmx mmxext sse sse2 sse3
グローバル環境に適用する例:
root #
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags
外部資料
- ニュース項目: new CPU_FLAGS_PPC USE_EXPAND