不穩定的 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
函數,它是對應的加速實作。
在此函數的結尾,函數指標指向最快的可用實作,並且可以被調用來執行計算。
搜尋的結果是