2 votes

Aliasing strict et type __m128i

Lorsque l'on utilise les fonctions intrinsèques du SSE2 pour effectuer des opérations sur les bits, il faut faire passer les pointeurs de int* a __m128i* . Ce code enfreint-il la règle stricte de l'aliasing ?

void bit_twiddling_func(int size, int const* input, int* output) {
    const __m128* x = (const __m128*)input;
    const __m128* y = (const __m128*)output;

    for (int i=0; i < size/4; ++i, ++x, ++y) {
        __m128i x4 = _mm_load_si128(x); // load 4 integers

        // do some bit twiddling

        _mm_store_si128(y, x4); // store 4 integers
    }
}

Merci de votre attention !

2voto

brandx Points 738

Oui, cela enfreint les règles strictes de l'aliasing. Deux types différents ne peuvent pas pointer vers le même emplacement dans la mémoire. Ici, x pointe sur l'entrée et y sur la sortie, mais ils sont de types différents.

Vous pourriez modifier la signature de votre fonction pour qu'elle prenne des paramètres __m128*, mais il est probablement plus facile de la laisser telle quelle. Cela fonctionnera probablement très bien si vous faites attention à ce que les arguments d'entrée/sortie pointent vers la mémoire avec les contraintes d'alignement et de taille appropriées (c'est-à-dire qu'ils doivent chacun pointer vers quelque chose où votre boucle n'indexe pas la fin ou ne charge pas de données non initialisées).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X