Home >Backend Development >C++ >Is Reinterpreting a SIMD Vector Pointer as a Different Type Undefined Behavior in C ?
Reinterpreting between SIMD Vector Pointer and Corresponding Type as Undefined Behavior
The question posed investigates whether it is admissible to use reinterpret_cast<__m256*>(&(stack_store[0])) to reinterpret a float* as a __m256* and access float objects through this different pointer type. It then examines if this practice violates strict aliasing rules or constitutes undefined behavior (UB) in the context of C language standards.
Addressing Undefined Behavior
The consensus is that ISO C does not explicitly define the behavior of __m256 types. However, upon examining Intel's intrinsics for these vector types, it becomes apparent that they allow vector-pointers like __m256* to be aliased with any other pointer type, similar to the behavior of char* in ISO C . Consequently, it is considered safe to dereference a __m256* instead of using aligned-load intrinsics like _mm256_load_ps().
Strict Aliasing Concerns
Furthermore, the aliasing behavior of __m256* does not violate the strict aliasing rules of C [basic.lval]/11. Strict aliasing forbids accessing an object through a pointer of a different type, but in this instance, the vector-pointers like __m256* are explicitly designated as being able to alias anything else, including scalar types and other vector types.
Accessing Vector Elements
While it is safe to dereference a __m256* to access vector elements, attempting to treat a __m256 vector as an array of scalars (e.g., using an indexing operator like hwvec1[0] ) or assigning scalar values directly to vector elements is considered undefined behavior. To manipulate individual vector elements, it is recommended to use either shuffle intrinsics (_mm_shuffle_epi16 / _mm_shuffle_epi8/32/64), insert/extract intrinsics (_mm_insert_epi16 / _mm_extract_epi16), or the appropriate GNU C vector syntax (e.g., v[3] = 1.25).
The above is the detailed content of Is Reinterpreting a SIMD Vector Pointer as a Different Type Undefined Behavior in C ?. For more information, please follow other related articles on the PHP Chinese website!