2017-02-25 9 views
1

I ont une structure alignée de 32 octets de 8 vecteurs qu'elle contient:Quand est-il correct de convertir en __m256 au lieu de charger?

struct ALIGN(32) Ray8 
{ 
    float x[8]; 
    float y[8]; 
    float z[8]; 
}; 

Lors de l'utilisation AVX2, je souhaite opérer sur ces éléments à l'unisson. Quand dois-je les charger explicitement en utilisant _mm256_load_ps() au lieu de les lancer? Par exemple, en utilisant la signature suivante:

void GenerateRayDirections(__m256 * x, _m256 * y, _m256 * z) { ... } 

invoquée comme

void GenerateRayDirections((__m256*)ray.x, (__m256*)ray.y, (__m256*)ray.z); 

J'utilise la bibliothèque de Embree d'Intel et ils ont une classe vfloat8 qui stocke en interne la représentation en tant que syndicat de _m256 et float8, donc il n'y a pas de casting du tout - mais il semble aussi n'y avoir aucun appel de charge. Si j'inclus les classes vfloat8 à la place:

void GenerateRayDirections(&ray.x.v, &ray.y.v, &ray.z.v); 

Je cherche des conseils sur le moment de charger ou de lancer?

+0

Chargez des vecteurs lorsque vous en avez besoin dans un vecteur et lancez-les quand vous voulez le concept de coulée, êtes-vous sûr de vouloir charger? Votre code de montage le prouve-t-il? – Martin

Répondre

0

En pratique, il ne devrait pas y avoir de différence entre un cast ou un appel à _mm256_load_ps en ce qui concerne l'assembly généré. Comme vous le signalez, vous pouvez même obtenir le résultat souhaité grâce à une union. Cependant, tous ces éléments génèrent des charges et stockent les instructions (vmov) sous le capot.

Pourquoi préféreriez-vous appeler manuellement _mm256_load_ps? Parce que cela vous oblige à penser quand les données sont déplacées de la mémoire vers un registre vectoriel. L'inconvénient de l'utilisation de la coulée et des syndicats est que vous pouvez devenir inconscient des charges et des magasins. Ils viennent avec des pénalités de latence significatives, bien pire que ce que le code source de haut niveau pourrait indiquer.

Un autre avantage de l'utilisation d'intrinsèques comme _mm256_loadu_ps est que vous autorisez des accès mémoire non alignés sans accidents vicieux.