不安定な 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つの関数を提供します。

この関数の最後では、関数ポインタは、使用可能な最も高速な実装を指し、計算を実行するために呼び出すことができます。

検索結果は次のようになります。