Département Informatique L3 Inforamtique Jean
Transcription
Département Informatique L3 Inforamtique Jean
Département Informatique L3 Inforamtique Jean-Michel Richer UE Architecture des Ordinateurs 2013/2014 [email protected] TP 4 Exercice 1 - Ecrire un programme assembleur (tp4_1_nasm.asm) qui permet de tester le temps pris par différentes méthodes de calcul de la somme de deux vecteurs. On créera trois tableaux d’entiers de 131.072 octets chacun alignés sur une adresse multiple de 16. On initialisera les deux premiers tableaux a et b de manière à ce que ∀i, ai = 1, bi = 2. On calculera ci = ai + bi . Le programme prendra en paramètres 2 arguments : – le nombre d’itérations de la boucle principale de calcul – la méthode choisie (entier) Les méthodes de calcul à utiliser ou implanter sont : – méthode 1 : simple traduction en assembleur – méthode 2 : dépliage de boucle par 2 – méthode 3 : dépliage de boucle par 4 – méthode 4 : utiliser des registres SSE ainsi que les instructions associées movdqa, paddd – méthode 5 : utiliser des registres SSE avec dépliage de boucle par 2 RDTSC : On utilisera l’instruction RDTSC pour calculer le nombre de cycles CPU utilisés par chaque méthode de copie afin de déterminer le temps d’exécution. L’instruction RDTSC (ReaD Time-Stamp Counter) donne le nombre de cycles d’horloge écoulés depuis la mise en marche de l’ordinateur et retourne le résultat sous forme d’une valeur 64 bits dans EDX:EAX. L’instruction RDTSC est exécutée dans le mode OOO (Out-Of-Order), il faut utiliser une instruction de synchronisation comme CPUID avant d’exécuter RDTSC. section .data ; compteur initial 64 bits cpu_start: dd 0,0 ; difference entre final et initial cpu_cycles: dd 0,0 ; affichage 64bits en 32bits msg: db "%llu", 10,0 section .text ; appel de CPUID, RDTSC xor eax,eax cpuid ; lecture compteur de cycle et enregistrement rdtsc mov [cpu_start],eax mov [cpu_start+4],edx ; traitement a realiser .... ; appel de CPUID, RDTSC xor eax,eax cpuid rdtsc ; calcul de la difference et stockage sub eax,[cpu_start] sbb edx,[cpu_start+4] mov [cpu_cycles],eax mov [cpu_cycles+4],edx ; affichage push edx push eax push dword msg call printf add esp,12