Traduction binaire dynamique de l extension SIMD Néon de l ARMv7 dans Qemu Travaux d études et de recherches Ensimag - Tima SLS 25 mai 2010
Table des matières 1 Introduction 2 Tiny code generator Les helpers 3 Recherche de solutions Première méthode : micro-opérations TCG classiques Deuxième méthode : micro-opérations TCG SIMD 4
Contexte du TER Laboratoire et tuteurs Laboratoire TIMA, équipe SLS Frédéric Pétrot et Nicolas Fournel Contexte de recherche Travaux autour de la simulation de systèmes, Systèmes de plus en plus lourds à simuler, Besoin d accélérer cette simulation.
Qemu : a fast and portable dynamic translator Simulation avec Qemu Logiciel open-source d émulation et de virtualisation, Traduction binaire dynamique du code d une architecture cible, Pour être exécuté par une architecture hôte. Objectif du TER Amélioration de la traduction de l architecture ARM, Sous-ensemble d instructions : instructions Neon.
Instructions Neon : des instructions SIMD Instructions SIMD Effectuer la même opération sur plusieurs données en même temps, Très efficace pour optimiser certains algorithmes, Vecteurs de données sur 64 bits ou 128 bits, Données de tailles variables suivant les instructions.
Exemple : vadd.i16 128bits 16bits 16bits 16bits 16bits 16bits 16bits 16bits q1 + + + + + + + q2 q0
Tiny code generator Les helpers La représentation intermédiaire : Tiny Code Generator Traduction en deux étapes 1 Traduction du code architecture cible vers micro-opérations TCG, 2 Traduction micro-opérations TCG vers code architecture hôte. Avantages de la TCG Code généré placé dans un buffer pour pouvoir être réutilisé, Indépendance des architectures cibles et architectures hôtes.
Fonctionnement de la TCG 0x00000110: mov sp, r0 0x00000114: sub r0, r0, #32768 0x00000118: msr CPSR_c, #209 Code de la machine cible ARM movi_i32 tmp9,$0xdf movi_i32 tmp10,$cpsr_write call tmp10,$0x0,$0,tmp8,tmp9 movi_i32 pc,$0x11c exit_tb $0x0 Représentation intermédiaire TCG 0xb4f270ac: mov $0xd1,%ecx 0xb4f270b1: mov %ecx,(%esp) 0xb4f270b4: mov $0xdf,%ecx 0xb4f270b9: mov %ecx,0x4(%esp) 0xb4f270bd: mov %eax,0x34(%ebp) 0xb4f270c0: mov %edx,0x0(%ebp) 0xb4f270c3: call 0x821fa25 0xb4f270c8: mov $0x11c,%eax 0xb4f270cd: mov %eax,0x3c(%ebp) 0xb4f270d0: xor %eax,%eax 0xb4f270d2: jmp 0x84ed448 Code généré pour la machine hôte x86
Tiny code generator Les helpers Méthode de traduction des instructions Neon : les helpers Les helpers Fonction écrite en C, simule une instruction, Compilée au même moment que Qemu, Appelée lors d une occurrence de l instruction correspondante.
Exemple de helper 0x00008584: vld1.32 {d0-d1}, [r0] 0x00008588: vld1.32 {d2-d3}, [r1] 0x0000858c: vadd.i16 q0, q1, q2 0x00008590: vst1.32 {d0-d1}, [r0] Code de la machine cible ARM uint32_t HELPER(neon_add_u16) (uint32_t a, uint32_t b) { uint32_t mask; mask = (a ^ b) & 0x80008000u; a &= ~0x80008000u; b &= ~0x80008000u; return (a + b) ^ mask; } Code du Helper ld_i32 tmp8,env,$0x2f8 ld_i32 tmp9,env,$0x308 movi_i32 tmp10,$neon_add_u16 call tmp10,$0x0,$1,tmp8,tmp8,tmp9 st_i32 tmp8,env,$0x2e8 Représentation intermédiaire TCG 0xb56c38b7: cmp 0xb56c38b9: mov 0xb56c38bb: je 0xb56c38bd: mov 0xb56c38c2: call 0xb56c38c7: jmp 0xb56c38c9: add (%edx),%eax %ecx,%eax 0xb56c38c9 $0x1,%edx 0x821ce38 0xb56c38ce 0xc(%edx),%eax Code généré pour la machine hôte x86
Sur-coût des helpers Tiny code generator Les helpers Sur-coûts des helpers Appel de fonction, Passage des paramètres, Adaptation des paramètres, Plusieurs appels car données sur 128 bits.
Recherche de solutions Recherche de solutions Première méthode : micro-opérations TCG classiques Deuxième méthode : micro-opérations TCG SIMD Deux méthodes pour améliorer la traduction 1 Remplacement des helpers par des micro-opérations TCG existantes, 2 Ajout de micro-opérations SIMD dans la TCG.
Recherche de solutions Première méthode : micro-opérations TCG classiques Deuxième méthode : micro-opérations TCG SIMD Première méthode : micro-opérations TCG classiques Conversion des helpers Conversion systématique des helpers en micro-opérations, Gain de l appel de fonction, Mais toujours adaptation des paramètres + répétition car données 32 bits.
Exemple avec vadd.i16 uint32_t HELPER(neon_add_u16)(uint32_t a, uint32_t b) { uint32_t mask; mask = (a ^ b) & 0x80008000u; a &= ~0x80008000u; b &= ~0x80008000u; return (a + b) ^ mask; } Code du Helper static inline int gen_neon_add_u16(tcgv t0, TCGv t1) { TCGv mask = new_tmp(); tcg_gen_xor_i32(mask, t0, t1); tcg_gen_andi_i32(mask, mask, 0x80008000u); tcg_gen_andi_i32(t0, t0, ~0x80008000u); tcg_gen_andi_i32(t1, t1, ~0x80008000u); tcg_gen_add_i32(t0, t0, t1); tcg_gen_xor_i32(t0, t0, mask); dead_tmp(mask); return 0; } Code traduit en µ-opérations
Réflexions sur la méthode, extensions Recherche de solutions Première méthode : micro-opérations TCG classiques Deuxième méthode : micro-opérations TCG SIMD Automatisation de la génération Conversion des helpers longues et source d erreurs, Description formelle des instructions dans la doc de ARM, Développement d un parser pour automatiser la génération.
Recherche de solutions Première méthode : micro-opérations TCG classiques Deuxième méthode : micro-opérations TCG SIMD Deuxième méthode : micro-opérations TCG SIMD Ajout de micro-opération SIMD dans la TCG Pas de micro-opération SIMD dans la TCG, D où l ajout de nouvelles micro-opérations, Implique modification TCG et architectures hôtes. Gains de performance Exploitation des instructions SIMD de l architecture hôte, Opérations sur des vecteurs données 64/128 bits en une fois, Plus besoin d adapter les paramètres. Exemple : vadd.i16 tcg gen simd 128 add i16(ret, arg1, arg2) ;
Réflexions sur la méthode, extensions Recherche de solutions Première méthode : micro-opérations TCG classiques Deuxième méthode : micro-opérations TCG SIMD Ensemble optimal de micro-opérations TCG Sous-ensemble optimal de µ-opérations à rajouter à la TCG? A la fois du point de vue de l architecture cible et hôte, En considérant plusieurs architectures avec instructions SIMD ARM Neon, x86 MMX/SSE, PowerPC Altivec, Sparc VIS...
Environnement de tests Bilan Traduction d une dizaine d instructions Neon avec les 2 méthodes, Environ 35 µ-opérations rajoutées dans la TCG. Linux dans Qemu Système minimaliste, mesure du temps d exécution d un benchmark, 10 millions d exécutions d une fonction avec instructions Neon
Résultats du benchmark Temps d exécutions 7 6,6 6,21 6,22 6 5,84 5 4 3 Premier temps d'exécution (s) Temps moyen d'exécution (s) 2 1,59 1,16 1 0 Version d'origine Version méthode 1 Version méthode 2
Résultats du benchmark Taille du basic block 2500 2087 2199 2000 1500 Taille du basic block (octet) 1000 500 420 0 Version d'origine Version méthode 1 Version méthode 2
Fin de la présentation Merci Questions?