De nombreuses instructions SSE permettent à l'opérande de source d'être une adresse de mémoire alignée de 16 octets. Par exemple, les différentes instructions (un) pack. PUNCKLBW a la signature suivante:SSE2 intrinsics: accès direct à la mémoire
PUNPCKLBW XMM1, XMM2/M128
Maintenant, cela ne semble pas être possible du tout avec intrinsics. Il semble qu'il soit obligatoire d'utiliser les intrinsèques _mm_load * pour lire quoi que ce soit en mémoire. Ceci est l'intrinsèque pour PUNPCKLBW:
__m128i _mm_unpacklo_epi8 (__m128i a, __m128i b);
(Pour autant que je sache, le type de __m128i se réfère toujours à un registre XMM.)
Maintenant, pourquoi est-ce? C'est plutôt triste puisque je vois un certain potentiel d'optimisation en adressant la mémoire directement ...
Je ne me plaindrais pas si le compilateur l'optimisait, mais au moins clang et gcc ne le font pas. C'est facile à vérifier avec l'option -S. Je trouve des traductions verbatim intrinsics -> assembly pour presque n'importe quel intrinsèque et peut mapper des registres directement aux variables. On dirait que ces compilateurs optimisent difficilement le code intrinsèque SIMD ... – dietr
@dietr: clang et gcc font tous deux cette optimisation, comme vous pouvez le voir dans mon exemple. Construisez-vous avec l'optimisation désactivée? Essayez d'utiliser '-O1' ou plus. –
J'utilise -O2. Je suppose que gcc/clang ne voit tout simplement aucun potentiel d'optimisation dans mon morceau de code ... – dietr