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 向量语法(例如 v[3] = 1.25) ).
以上是将 SIMD 向量指针重新解释为 C 中的不同类型未定义行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!