Si une charge de 16 octets ne franchira pas dans une autre page et défaut, utilisez movups
. Les 4 octets hauts seront ce qu'il y a de déchets dans la mémoire. Causer un manque de mémoire cache pour le 4B dont vous ne tenez pas compte peut être un problème, tout comme la séparation de la ligne de cache.
Sinon, utilisez movq
/pinsrd
(SSE4.1), ou un autre moyen de faire deux charges + une lecture aléatoire. movq
+ pinsrd
va être 3 uops à domaine fusionné sur les processeurs Intel SnB, car pinsrd
ne peut pas microfusionner. (Et son ALU uop nécessite le port shuffle (p5)).
Une autre possibilité: AVX VMASKMOVPS xmm1, xmm2, m128
.
déplace conditionnellement éléments de données condensées à partir du second opérande de source dans l'élément de données correspondant de l'opérande de destination, en fonction des bits de masquage associés à chaque élément de données (MSB du premier opérande src).
... Les défauts ne se produit en raison de référence à tout emplacement de mémoire si le bit de masque correspondant à cet emplacement de mémoire est 0.
Intel Haswell: 3 uops-domaine fusionné (une charge et deux aléatoire (p5)). Latence 4c, un débit par 2c.
Ce n'est probablement pas très bon comparé, esp. si le code environnant doit mélanger.
Votre branche conditionnelle très rarement prises qui utilise movups
tout temps il est garanti de ne pas la faute est aussi 3 UOP-domaine fusionné sur le chemin rapide, et l'un d'entre eux peut fonctionner sur port6 (pas en concurrence avec vecteur ALU du tout). Le LEA n'est pas sur le chemin critique non plus.
movlpd
est sûr à utiliser sur toutes les données. Il ne sera jamais en faute ou sera lent avec des données qui représentent un NaN en virgule flottante, ou quelque chose comme ça. Vous n'avez qu'à vous soucier de cela avec des instructions qui sont listées dans le manuel d'insn ref avec une section non-vide "SIMD Floating-Point Exceptions". par exemple. addps
peut générer des exceptions "Dépassement, Sous-flux, Invalide, Précision, Dénormal", mais shufps
indique "Aucun".
Malheureusement, je ne contrôle pas la position ou les dimensions de l'entrée , donc je ne peux pas dépasser. 'movq' et' pinsrd' est ce que j'ai trouvé aussi; merci de confirmer. – jacobsa
Merci également pour la note sur 'movlpd'. Mais ma question est la suivante: pourquoi est-il documenté comme s'appliquant aux valeurs à virgule flottante en particulier? – jacobsa
@jacobsa: Si vous savez qu'il y a une mémoire lisible * avant * le 12B que vous voulez, vous pouvez charger à partir de [[addr-4]], puis décaler ("psrldq"). Ou vous pouvez même masquer l'adresse pour obtenir un pointeur 16B-aligné qui couvre certaines des données que vous voulez (et ne peut toujours pas faute). –