Question

Supposons que j'ai un tableau:

uint8_t arr[256];

et un élément

__m128i x

contenant 16 octets,

x_1, x_2, ... x_16

Je voudrais remplir efficacement un nouvel élément __m128i

__m128i y

avec des valeurs de arr en fonction des valeurs de x, de telle sorte que:

y_1  = arr[x_1]
y_2  = arr[x_2]
   .
   .
   .
y_16 = arr[x_16]

Une commande pour atteindre cet objectif serait essentiellement de charger un registre d'un ensemble non contigu d'emplacements de mémoire. J'ai une mémoire douloureuse vague d'avoir vu la documentation de commande un tel, mais ne trouve pas maintenant. Existe t-il? Merci d'avance pour votre aide.

Était-ce utile?

La solution

Ce genre de capacité dans les architectures SIMD est connue sous le nom de dispersion de charge / magasin / gather. Malheureusement, SSE ne l'a pas. futures architectures SIMD d'Intel peuvent avoir ce - le processeur Larrabee infortunée était un exemple. Pour l'instant, si vous aurez juste besoin de concevoir vos structures de données de telle sorte que ce genre de fonctionnalité n'est pas nécessaire.

Notez que vous pouvez obtenir l'effet équivalent en utilisant par exemple _mm_set_epi8:

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]);

même si bien sûr cela va juste générer un tas de code scalaire pour charger votre vecteur y. Ceci est bien si vous faites ce genre d'opération en dehors des boucles de performance critiques, par exemple dans le cadre de l'initialisation avant le bouclage, mais à l'intérieur d'une boucle, il est susceptible d'être un tueur de performance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top