可能であれば、CPU 固有の機能を使用する Python 拡張機能があります。これは、実行時チェックによって行われます。ハードウェアが命令をサポートしている場合はPOPCNT
、内部ループの 1 つの実装を選択し、SSSE3 が利用可能な場合は別の実装を選択し、それ以外の場合はパフォーマンス クリティカルなカーネルの汎用バージョンにフォールバックします。(約 95% 以上の時間がこのカーネルで費やされます。)
残念ながら、私が予期していなかった失敗モードがあります。-mssse3
andを使用し-O3
てすべての C コードをコンパイルしますが、その-mssse3
オプションが必要なファイルは 1 つだけです。その結果、他のファイルは、SSSE3 が存在することを期待してコンパイルされます。これにより、次の行でセグメンテーション違反が発生します。
start_target_popcount = (int)(query_popcount * threshold);
コンパイラfisttpl
が SSSE3 命令である を使用したためです。結局、SSSE3が存在すると仮定するように言いました。
最近、私のパッケージの Debian パッケージャーがこの問題に遭遇しました。これは、テスト マシンには GCC を理解-mssse3
してコードを生成する GCC があるためですが、マシン自体には古い CPU があり、それらの指示がありません。
Debian メンテナーがそのディストリビューションに使用できる、古いマシンと新しいマシンで同じバイナリが機能するソリューションが必要です。
理想的には、-mssse3
オプションを使用してコンパイルされるファイルは 1 つだけです。私の CPU 固有のセレクター コードはこのファイルの一部ではないため、CPU がサポートしない限り、SSSE3 コードは実行されません。
distutils
ただし、一連のコンパイラ オプションが 1 つのファイルに固有のものであることを確認する方法がわかりません。
それは可能ですか?