2016-05-09 63 views
2

我正在學習openMP,並且我的知識有限,已經對我的代碼進行了合併。我正在嘗試使用openMP矢量化技術來改進此代碼。但在閱讀相關的閱讀材料(link)時,我發現無法對long double數據類型進行矢量化操作。有人可以提供有關它爲什麼如此的信息,並建議一種解決方案,而不是降低精度? 「在SIMD硬件中避免操作不受支持,在Linux上運算符長度爲(80位),其餘操作符」%「是SIMD硬件不支持的操作示例。 「對long double數據類型的openMP矢量化操作是不可能的?

PS我使用INTEL C++編譯器16.0.2,具有128位長向量寄存器和Linux的INTEL XEON處理器。我的數據類型大多是長雙。

+0

我認爲你是混淆平行與矢量內在。我懷疑可以並行化這些操作,即使它們沒有映射到英特爾的ISA。無論如何,你需要發佈一個完整的,可運行的例子。 – Mikhail

+0

由於x86 SIMD硬件(SSE至AVX512)僅支持32位和64位浮點操作,並且沒有整數除法指令。 –

+0

你爲什麼使用長雙? –

回答

3

x86指令集的SIMD指令僅支持32位和64位浮點運算(對16位浮點數有一些有限的支持)。此外,即使有64位乘以64位到128位的標量整數指令(例如mulx),也沒有相應的SIMD指令。許多人已經嘗試過並且未能實現高效的128位整數x86 SIMD算法(multiplicationaddition有一些例外)。沒有通用的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構建實現兩倍。你需要自己實現或找到一個庫。

相關問題