不安定な SIMD モジュール
このモジュールは、SIMD 命令を使用してコードをビルドするためのヘルパー機能を提供します。0.42.0以降で利用できます。
注意: このモジュールはまだ、不安定です。プレビュー版として提供されているに過ぎません。APIはリリース間で、任意の変更が加えられたり、Mesonから完全に削除されたりする可能性があります。
使用法
このモジュールは、1つまたは複数のSIMD実装を持つアルゴリズムがあり、実行時に使用するものを選択するユースケース向けに設計されています。
モジュールでは、check
というメソッドが1つ提供されており、次のように使用します。
rval = simd.check('mysimds',
mmx : 'simd_mmx.c',
sse : 'simd_sse.c',
sse2 : 'simd_sse2.c',
sse3 : 'simd_sse3.c',
ssse3 : 'simd_ssse3.c',
sse41 : 'simd_sse41.c',
sse42 : 'simd_sse42.c',
avx : 'simd_avx.c',
avx2 : 'simd_avx2.c',
neon : 'simd_neon.c',
compiler : cc)
この場合、各ファイルには問題の関数の高速化バージョンが含まれています。compiler
キーワード引数は、それらをコンパイルするために使用するコンパイラを取得します。関数は2つの値を持つ配列を返します。最初の値は、コンパイルされたコードを含むライブラリの束です。コンパイラがコンパイルできないSIMDコード(x86マシンでのNeon命令など)は無視されます。この値は、link_with
を使用して目的のターゲットに渡す必要があります。2番目の値は、configuration_data
オブジェクトで、サポートされているすべての値に対してtrueが格納されています。たとえば、コンパイラがsse2命令をサポートしている場合、オブジェクトにはHAVE_SSE2
が1に設定されます。
実行時に適切な命令セットを検出するコードを生成するのは簡単です。まず、設定オブジェクトを使用してヘッダーを作成し、次に次のような選択関数を作成します。
void (*fptr)(type_of_function_here) = NULL;
#if HAVE_NEON
if(fptr == NULL && neon_available()) {
fptr = neon_accelerated_function;
}
#endif
#if HAVE_AVX2
if(fptr == NULL && avx2_available()) {
fptr = avx_accelerated_function;
}
#endif
...
if(fptr == NULL) {
fptr = default_function;
}
各ソースファイルは、現在のCPUがその命令セットをサポートしているかどうかを確認するためのxxx_available
関数と、対応する高速化実装であるxxx_accelerated_function
という2つの関数を提供します。
この関数の最後では、関数ポインタは、使用可能な最も高速な実装を指し、計算を実行するために呼び出すことができます。
検索結果は次のようになります。