Simulateur AVX2

Construire un court pipeline d'intrinsics et inspecter bits de registres, lanes et accès mémoire exacts.

À propos de cet outil

Construisez un pipeline d’au plus huit intrinsèques AVX2 ou AVX flottants listés, puis appuyez sur Exécuter. Modifier une entrée efface tous les résultats ; rien ne s’exécute automatiquement. Réinitialiser les résultats conserve vos entrées. Changer la vue de sortie ne fait que réinterpréter les bits du résultat existant et reste sélectionné au prochain lancement. Rouvrir l’outil repart de l’exemple d’addition inactif ; les pipelines longs et la mémoire ne sont pas enregistrés. Copier les valeurs reprend la vue choisie du vecteur, le masque scalaire non signé ou les 256 octets mémoire après un store.

Chaque opérande a sa propre vue explicite. La voie 0 est la voie de poids faible et se saisit en premier, de gauche à droite. L’entrée entière est signée ou non signée en base 10 dans la plage du type choisi ; les entiers 64 bits restent exacts. Les nombres sont séparés par des virgules ou des espaces, sans virgules vides. L’entrée flottante utilise un point décimal et peut utiliser un exposant, NaN, Infinity, -Infinity ou -0. Une valeur finie qui déborde le type flottant choisi est rejetée. L’entrée hex utilise des paires d’octets complètes ; l’entrée bits place le bit de poids fort en premier dans chaque octet. Les octets eux-mêmes vont toujours de l’adresse basse vers la haute. Saisissez le nombre exact de valeurs indiqué ; pas de remplissage, de troncature ni de détection de type au collage.

L’intrinsèque détermine l’arithmétique, la largeur de voie et le caractère signé ; choisir u32 au lieu de i32 change la vue des bits, pas l’instruction. Changer une vue d’entrée reformate les bits existants valides ; un brouillon invalide est conservé pour correction. Les tableaux de sortie montrent les indices de voie, les plages de bits, la vue choisie, les équivalents entiers le cas échéant, et les octets little-endian. Des sections de tableau distinctes identifient les moitiés 128 bits. Les drapeaux signalent la saturation, le wraparound, les opérations dans les moitiés et les règles spéciales de source ou de masque.

Utiliser le résultat précédent ne relie qu’un vecteur de la largeur exacte requise au premier opérande. Son texte est rempli après un lancement réussi. Un movemask scalaire ou le résultat mémoire d’un store ne peut pas être enchaîné comme vecteur. Il n’y a pas d’élargissement implicite de 128 à 256 bits. Décochez l’option pour utiliser un opérande manuel. Les masques scalaires s’affichent à part en décimal non signé et en hexadécimal.

Les opérations mémoire partagent une source de 256 octets saisie en hex. Un lancement travaille sur une copie : les stores alimentent les opérations mémoire suivantes de ce lancement sans écraser le texte source. Les décalages de base et les échelles gather sont en octets ; les indices gather sont signés. Les bornes ne s’appliquent qu’aux accès actifs. Une voie masquée inactive n’a pas d’adresse évaluée et s’affiche avec un tiret. Le bit de masque de poids fort détermine la sélection. Les stream loads exigent un alignement de 32 octets ; loadu accepte les adresses non alignées. Les stores montrent les octets modifiés et, en option, la mémoire complète ; le détail d’accès montre aussi les écritures qui laissent un octet inchangé.

Les exemples couvrent l’addition, le wraparound entier, la saturation, le mélange d’octets dans les moitiés 128 bits, un chargement non aligné à l’offset 3, et add suivi d’un décalage. L’exemple shuffle utilise un bit de contrôle haut pour mettre à zéro son premier octet. Chaque exemple ne fait que préparer les entrées ; Exécuter effectue le calcul. Si une étape échoue, le pipeline ne publie aucun résultat partiel.

C’est une simulation pédagogique, pas un émulateur de CPU. Elle ne modélise ni le timing, ni les drapeaux CPU, ni les modes MXCSR, ni les charges utiles NaN, ni les caches, ni les fautes matérielles. Les opérations flottantes utilisent des valeurs IEEE f32/f64 normales avec l’arrondi au plus proche de JavaScript ; les résultats peuvent être Infinity ou NaN. Source : Intel Intrinsics Guide.