x86指令集的SIMD指令僅支持32位和64位浮點運算(對16位浮點數有一些有限的支持)。此外,即使有64位乘以64位到128位的標量整數指令(例如mulx
),也沒有相應的SIMD指令。許多人已經嘗試過並且未能實現高效的128位整數x86 SIMD算法(multiplication和addition有一些例外)。沒有通用的x86 SIMD整數除法指令。
但是,對於浮點型的人來說,使用double-double更高精度的浮點SIMD操作已經取得了更大的成功。 Double-double具有106位的精度,而精度爲64位的具有80位長度的雙精度。但並非每個C++編譯器都使用80位長的double。有些僅使用雙精度(例如MSVC),其僅具有54位精度,一些使用具有113位精度的128位四精度,並且維基百科甚至聲稱,對於某些編譯器,long double實現爲雙精度雙精度。
我描述了雙雙here的一些細節。請注意,double-double不是IEEE浮點類型,它有一些不尋常的屬性。此外,double-double的範圍與double相同,因此僅提高了精度。
與長雙倍相比,雙倍速度有多快?我從來沒有測試過這個。但是,我發現雙倍運算速度比雙倍運算速度慢10倍左右,因爲它在進行乘法和加法操作時有點平衡。長雙倍肯定比雙倍慢(除非它是雙倍實現的)。但由於您可以使用雙倍的SIMD,但不能使用長雙倍內置,所以速度與SIMD寬度成正比。所以2個SSE2的雙重操作,4個AVX和8個AVX512。
不要指望OpenMP的simd
構建實現兩倍。你需要自己實現或找到一個庫。
我認爲你是混淆平行與矢量內在。我懷疑可以並行化這些操作,即使它們沒有映射到英特爾的ISA。無論如何,你需要發佈一個完整的,可運行的例子。 – Mikhail
由於x86 SIMD硬件(SSE至AVX512)僅支持32位和64位浮點操作,並且沒有整數除法指令。 –
你爲什麼使用長雙? –