2016-12-11 1 views
5

Je souhaite utiliser intrinsics pour incrémenter les éléments d'un vecteur SIMD. La façon la plus simple semble être d'ajouter 1 à chaque élément, comme celui-ci:Comment incrémenter un vecteur dans AVX/AVX2

(note: vec_inc a été fixé à 1 avant)

vec = _mm256_add_epi16 (vec, vec_inc); 

mais est-il une instruction spéciale pour incrémenter un vecteur? Comme inc dans this page? Ou tout autre moyen plus facile?

+2

Non, il n'y a pas d'instruction particulière - il suffit d'ajouter un vecteur de 1s, comme vous le suggérez ci-dessus. –

Répondre

7

L'instruction INC n'est pas une instruction de niveau SIMD, elle fonctionne sur des scalaires entiers. Comme vous l'avez déjà suggéré, le plus simple est d'ajouter 1 à chaque élément vectoriel, ce que vous pouvez faire en ajoutant un vecteur de 1 s.

Si vous souhaitez simuler un intrinsèque, vous pouvez implémenter votre propre fonction:

inline __m256i _mm256_inc_epi16(__m256i a) 
{ 
    return _mm256_add_epi16(a, _mm256_set1_epi16(1)); 
} 

Pour des questions similaires sur intrinsics x86 dans l'avenir, vous trouverez la collection d'Intel ISA intrinsics à Intel's Intrinsics Guide . Voir aussi les nombreuses ressources documentées sous la et info tag:

+0

J'ai mangé 'Intel Instrinsics Guide'. En passant, je vais accepter la réponse – Martin

+4

Si vous avez encore faim après avoir mangé le Guide Intel Intrinsics, assurez-vous de consulter les ressources dans le tag [tag: x86] wiki. :-) @fac J'ai ajouté cela à la réponse pour les futurs utilisateurs, aussi. –

+1

@CodyGray: Il y a aussi quelques choses de type didacticiel intrinsèque SSE/AVX dans le [wiki tag SSE] (http://stackoverflow.com/tags/sse/info). Le tag x86 wiki mentionne ceci (en haut), mais je suspecte la plupart des gens de ne pas le remarquer. –