Maison >développement back-end >C++ >La réinterprétation d'un pointeur vectoriel SIMD en tant que type différent est-elle un comportement non défini en C ?
Réinterprétation entre le pointeur vectoriel SIMD et le type correspondant en tant que comportement non défini
La question posée examine s'il est admissible d'utiliser reinterpret_cast<__m256*> ;(&(stack_store[0])) pour réinterpréter un float* comme un __m256* et accédez aux objets float via ce type de pointeur différent. Il examine ensuite si cette pratique viole des règles strictes d'alias ou constitue un comportement indéfini (UB) dans le contexte des normes du langage C.
Résoudre les comportements non définis
Le consensus est que ISO C ne définit pas explicitement le comportement des types __m256. Cependant, en examinant les caractéristiques intrinsèques d'Intel pour ces types de vecteurs, il devient évident qu'ils permettent à des pointeurs vectoriels comme __m256* d'être alias avec n'importe quel autre type de pointeur, similaire au comportement de char* en ISO C . Par conséquent, il est considéré comme sûr de déréférencer un __m256* au lieu d'utiliser des intrinsèques à charge alignée comme _mm256_load_ps().
Problèmes d'alias stricts
De plus, le comportement d'alias de __m256* ne viole pas les règles strictes d'alias de C [basic.lval]/11. L'alias strict interdit d'accéder à un objet via un pointeur d'un type différent, mais dans ce cas, les pointeurs vectoriels comme __m256* sont explicitement désignés comme pouvant alias n'importe quoi d'autre, y compris les types scalaires et d'autres types vectoriels.
Accès aux éléments vectoriels
Bien qu'il soit sûr de déréférencer un __m256* pour accéder aux éléments vectoriels, tenter de traiter un vecteur __m256 comme un tableau de scalaires (par exemple, en utilisant un opérateur d'indexation comme hwvec1[0] ) ou attribuer des valeurs scalaires directement aux éléments vectoriels est considéré comme un comportement indéfini. Pour manipuler des éléments vectoriels individuels, il est recommandé d'utiliser soit des intrinsèques aléatoires (_mm_shuffle_epi16 / _mm_shuffle_epi8/32/64), des intrinsèques d'insertion/extraction (_mm_insert_epi16 / _mm_extract_epi16) ou la syntaxe vectorielle GNU C appropriée (par exemple, v[3] = 1,25). ).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!