首頁 >後端開發 >C++ >將 SIMD 向量指標重新解釋為 C 中的不同類型未定義行為嗎?

將 SIMD 向量指標重新解釋為 C 中的不同類型未定義行為嗎?

Patricia Arquette
Patricia Arquette原創
2024-12-20 12:50:21304瀏覽

Is Reinterpreting a SIMD Vector Pointer as a Different Type Undefined Behavior in C  ?

SIMD向量指標和相應類型之間重新解釋為未定義行為

提出的問題調查是否允許使用reinterpret_cast<__m256> ;(&(stack_store[0])) 將float* 重新解釋為__m256*並透過這種不同的指標類型存取浮點物件。然後,它會檢查這種做法是否違反了嚴格的別名規則或構成 C 語言標準上下文中的未定義行為 (UB)。

解決未定義行為

共識是ISO C 沒有明確定義 __m256 類型的行為。然而,在檢查英特爾這些向量類型的內在函數後,很明顯地它們允許像 __m256* 這樣的向量指標與任何其他指標類型別名,類似於 ISO C 中 char* 的行為。因此,取消引用 __m256* 而不是使用像 _mm256_load_ps() 這樣的對齊載入內在函數被認為是安全的。

嚴格別名問題

此外, __m256* 不違反 C 嚴格的別名規則[基本.lval]/11。嚴格別名禁止透過不同類型的指標存取對象,但在這種情況下,像 __m256* 這樣的向量指標被明確地指定為能夠為其他任何內容別名,包括標量類型和其他向量類型。

存取向量元素

雖然取消引用__m256* 來存取是安全的向量元素,試著將__m256 向量視為標量數組(例如,使用hwvec1[ 0] 等索引運算子)或將標量值直接指派給向量元素被視為未定義行為。若要操作單一向量元素,建議使用shuffle 內在函數(_mm_shuffle_epi16 / _mm_shuffle_epi8/32/64)、插入/提取內在函數(_mm_insert_epi16 / _mm_extract_epi16) 或適當的GNU C 向量語法(例如)[25] 1.25) 🎜>

以上是將 SIMD 向量指標重新解釋為 C 中的不同類型未定義行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn