2016-05-07 4 views
0

Puis-je définir un pointeur de fonction pour _mm_load_ps, _mm_store_ps et similaires?intel intrinsics - pointeurs de fonction à charger/stocker

Je pense à quelque chose comme

float* x0; //param 
... 
__m128 (*load_x0)(float const *mem); 
if((unsigned long)x0 & 15) load_x0 = &_mm_loadu_ps; 
else load_x0 = &_mm_load_ps; 

mais qui mène à

référence non définie à _mm_load_ps

référence non définie à _mm_loadu_ps

Répondre

2

fonctions sont compilées Intrinsic directement dans les instructions qu'ils représentent. Aucun appel de fonction n'est émis et aucune implémentation de ces fonctions n'existe dans une bibliothèque. Pour cette raison, vous ne pouvez pas utiliser un intrinsèque en tant que pointeur de fonction.

Pensez à faire des emballages comme ceux-ci:

__m128 my_mm_load_ps(float const *mem) 
{ 
    return _mm_load_ps(mem); 
} 

__m128 my_mm_loadu_ps(float const *mem) 
{ 
    return _mm_loadu_ps(mem); 
} 

Vous pouvez utiliser les emballages comme les pointeurs de fonction:

__m128 (*load_x0)(float const *mem); 
if((unsigned long)x0 & 15) load_x0 = &my_mm_loadu_ps; 
else load_x0 = &my_mm_load_ps; 
+0

Intéressant. Donc, je gagne à utiliser la charge alignée lorsque cela est possible, mais j'ai besoin de payer un surcoût pour un appel de fonction supplémentaire. Vous pensez que cela va payer? – User1291

+2

@ User1291 Non, ce ne sera pas le cas. Il n'y a pas de différence entre les instructions alignées et non alignées (lorsqu'elles sont utilisées sur des données alignées) sur toutes les microarchitectures à l'exception de quelques très anciennes. – fuz

+1

@ User1291 Utilisez simplement des charges non alignées pour tout et tout ira bien. Benchmark en cas de doute. – fuz

-1

vous incluez la il fichiers ader pour ces fonctions?

« xmmintrin.h » est l'en-tête approprié pour ces charges de vecteur

+0

Bien sûr. (Eh bien, en utilisant pmmintrin.h, en fait.) Je supprime les affectations à '' load_x0'' et j'utilise obstinément '' _mm_loadu_ps'' partout, il n'y a pas une telle erreur. – User1291

+2

Si ce sont des intrinsèques du compilateur, alors ils n'ont pas d'adresse et vous ne pouvez pas faire référence à eux. –

+0

Et je ne pense pas qu'il existe un moyen de contourner cette restriction, non? C'est ... insatisfaisant. Quoi qu'il en soit, merci. Vous voulez élaborer afin que je puisse l'accepter comme une réponse? – User1291