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 ?

La réinterprétation d'un pointeur vectoriel SIMD en tant que type différent est-elle un comportement non défini en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-20 12:50:21306parcourir

Is Reinterpreting a SIMD Vector Pointer as a Different Type Undefined Behavior in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn