不穩定的 SIMD 模組

此模組提供輔助功能來建置使用 SIMD 指令的程式碼。自 0.42.0 版本起可用。

注意:此模組不穩定。它僅作為技術預覽提供。其 API 可能在不同版本之間以任意方式變更,或者可能完全從 Meson 中移除。

使用方法

此模組設計用於當您有一個或多個 SIMD 實作的演算法,並且您在執行時選擇要使用哪一個的情況。

此模組提供一個方法 check,使用方式如下

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 關鍵字引數接受您將用來編譯它們的編譯器。此函數回傳一個包含兩個值的陣列。第一個值是一組包含已編譯程式碼的函式庫。任何編譯器無法編譯的 SIMD 程式碼(例如,在 x86 機器上的 Neon 指令)都會被忽略。您應該使用 link_with 將此值傳遞給所需的目標。第二個值是一個 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;
}

每個原始碼檔案都提供兩個函數,xxx_available 函數用於查詢目前使用的 CPU 是否支援指令集,以及 xxx_accelerated_function 函數,它是對應的加速實作。

在此函數的結尾,函數指標指向最快的可用實作,並且可以被調用來執行計算。

搜尋的結果是