PROCESSEUR SOFTCORE LIBRE

Documents pareils
Architecture des Ordinateurs. Partie II:

ASR1 TD7 : Un microprocesseur RISC 16 bits

IV- Comment fonctionne un ordinateur?

Mesure de performances. [Architecture des ordinateurs, Hennessy & Patterson, 1996]

Exécution des instructions machine

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Matériel & Logiciels (Hardware & Software)

On distingue deux grandes catégories de mémoires : mémoire centrale (appelée également mémoire interne)

Sur un ordinateur portable ou un All-in-One tactile, la plupart des éléments mentionnés précédemment sont regroupés. 10) 11)

GPA770 Microélectronique appliquée Exercices série A

Une version javascript sera disponible directement dans le cours prochainement.

La mémoire. Un ordinateur. L'octet. Le bit

Démontage d'un ordinateur

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Cours Informatique 1. Monsieur SADOUNI Salheddine

Compilation (INF 564)

Transmission d informations sur le réseau électrique

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction à l architecture des ordinateurs. Adrien Lebre Décembre 2007

Architecture des ordinateurs

Rappels d architecture

Représentation d un entier en base b

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

ACTIVITÉ DE PROGRAMMATION

Informatique Industrielle Année Architecture des ordinateurs Note de cours T.Dumartin

Architecture des ordinateurs Introduction à l informatique

Cours 3 : L'ordinateur

TD : Codage des images

Hiérarchie matériel dans le monde informatique. Architecture d ordinateur : introduction. Hiérarchie matériel dans le monde informatique

Conception de circuits numériques et architecture des ordinateurs

ISO/CEI NORME INTERNATIONALE

Tout savoir sur le matériel informatique

Leçon 1 : Les principaux composants d un ordinateur

PROGRAMME DU CONCOURS DE RÉDACTEUR INFORMATICIEN

Vers du matériel libre

Structure de base d un ordinateur

TD Architecture des ordinateurs. Jean-Luc Dekeyser

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Alcatel OmniPCX Enterprise TSC-IP V1 (4098RE)

Traduction binaire dynamique de l extension SIMD Néon de l ARMv7 dans Qemu

Quoi de neuf en LabVIEW FPGA 2010?

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Éléments d'architecture des ordinateurs

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Introduction au langage C

Prise en main. Prise en main - 0

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Un ordinateur, c est quoi?

Mesurer les performances (CPU) sous Linux

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Structure et fonctionnement d'un ordinateur : hardware

Chapitre 4 : Les mémoires

MAC-TC: programmation d un plate forme DSP-FPGA

Cours Langage C/C++ Programmation modulaire

Chapitre 1 I:\ Soyez courageux!

Représentation des Nombres

TAI049 Utiliser la virtualisation en assistance et en dépannage informatique TABLE DES MATIERES

Département informatique de l université d Angers

Systèmes embarqués D.Rossier

Auteur LARDOUX Guillaume Contact Année 2014 DEVELOPPEMENT MOBILE AVEC CORDOVA

Installation et prise en main

Les systèmes embarqués Introduction. Richard Grisel Professeur des Universités Université de Rouen Nacer Abouchi Professeur ESCPE Lyon

Partie 1. Professeur : Haouati Abdelali. CPGE Lycée Omar Ibn Lkhattab - Meknès haouaticpge@gmail.com

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Architecture matérielle des systèmes informatiques

Informatique Générale

Quelques éléments de compilation en C et makefiles

Programmation C. Apprendre à développer des programmes simples dans le langage C

Cours 1 : Qu est-ce que la programmation?

Fonctionnement et performance des processeurs

Le Programme SYGADE SYGADE 5.2. Besoins en équipement, logiciels et formation. UNCTAD/GID/DMFAS/Misc.6/Rev.7

TRAAM STI Acquisition et exploitations pédagogiques des données sur un système pédagogique

Chapitre VI- La validation de la composition.

Programmation C++ (débutant)/instructions for, while et do...while

Le langage C. Séance n 4

Chapitre 18 : Transmettre et stocker de l information

Créer un document composite avec NéoOffice J et le partager

CM2 L architecture MIPS32

Chapitre 1 : Introduction aux méthodologies de conception et de vérification pour SE

V- Manipulations de nombres en binaire

Livrable 2.1 Rapport d analyse et de restructuration de code monothread des modules P, T, Q et F de l encodage MPEG-4 AVC

Conversion d un entier. Méthode par soustraction

QUESTION 1 {2 points}

GCOS 7 sur microprocesseur standard Diane Daniel POIRSON 14 octobre 2004 Matériels 64 / DPS 7 / DPS 7000 Architecture & Evolution - Daniel POIRSON 1

Cours 1 : La compilation

Introduction à l informatique en BCPST

Ajouter de la mémoire à son ordinateur

IFT1215 Introduction aux systèmes informatiques

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

UE Programmation Impérative Licence 2ème Année

Electron S.R.L. SERIE B46 - SYSTEMES DIDACTIQUES DE TELEPHONIE

Informatique industrielle A Systèmes temps-réel J.F.Peyre. Partie I : Introduction

Informatique. Les réponses doivent être données en cochant les cases sur la dernière feuille du sujet, intitulée feuille de réponse

Windows serveur 2008 installer hyperv

Etudier l influence de différents paramètres sur un phénomène physique Communiquer et argumenter en utilisant un vocabulaire scientifique adapté

Transcription:

ENSEIRB- MATMECA PROCESSEUR SOFTCORE LIBRE Guillaume JUGLIN Helmi BOUAJLA Hela GUESMI Sully DRU Encadré par Bertrand LEGAL

Sommaire I. Introduction... 5 II. Méthodes et choix de l optimisation... 6 1. Présentation du processeur :... 6 a. Le projet plasma :... 6 b. Architecture du processeur et schéma blocs :... 7 c. Plasma et le jeu d instructions MIPS :... 8 2. Contexte du projet_s9 :... 9 a. Méthode d optimisation... 9 b. Moyens et outils mis à disposition :... 9 3. Choix de la méthode... 11 a. Objectif... 11 b. Identification des besoins... 11 c. Ajout d une instruction... 12 III. La chaine de compression JPEG... 15 1. Introduction... 15 2. Etude du code des fonctions de la chaine JPEG... 15 3. Modification : iquantification... 16 a. Définition de la fonction en VHDL :... 16 b. Instruction dans le processeur :... 17 c. Test de l instruction :... 17 d. Résultats :... 18 4. Modification : RLE... 18 a. Définition de la fonction en VHDL :... 18 b. Instruction dans le processeur :... 19 c. Test de l instruction :... 19 d. Résultats :... 19 IV. Décodeur MP3... 20 1. Présentation :... 20 2. Etude du système :... 20 3. Modification : MULSHIFT32... 22 a. Instruction dans le processeur :... 22 b. Définition de la fonction en VHDL :... 22 c. Test de l instruction :... 23 2011-2012 Page 2

d. Résultats :... 24 4. Modification : MADD64... 25 a. Définition de la fonction en VHDL :... 25 b. Test de l instruction :... 26 c. Résultats :... 27 V. Conclusion... 28 2011-2012 Page 3

Table des illustrations : Figure 1 : Carte Spartan 3E... 6 Figure 2: Plasma CPU site... 7 Figure 3: Diagramme bloc... 7 Figure 4: Equipements IMS... 10 Figure 5: Ports PCIe... 10 Figure 6: Outil Gprof... 12 Figure 7:Présentation de la chaine JPEG... 15 Figure 8: Compilation de la chaine JPEG à l'aide de gprof... 15 Figure 9: Code VHDL dmult... 17 Figure 10: Insertion instructions dans le processeur... 17 Figure 11:code assembleur généré... 17 Figure 12: exécution après l'ajout de l'instruction... 18 Figure 13: exécution avant l'ajout de l'instruction... 18 Figure 14: Code VHDL de l'instruction outrle... 18 Figure 15: code assembleur généré... 19 Figure 16: exécution avant l'ajout de l'instruction... 19 Figure 17 : exécution après l'ajout de l'instruction... 19 Figure 18: Temps exécution sans modification... 20 Figure 19: Temps d'exécution des fonctions à l'aide de l'outil Gprof... 21 Figure 20: Détermination de la nouvelle instruction... 22 Figure 21: Description de l'instruction VHDL de mul_32msb... 23 Figure 22: Code assembleur correspondant à la modification... 24 Figure 23: Temps d'exécution après modification de MULSHIFT32... 24 Figure 24: Description de l'instruction VHDL de sum... 25 Figure 25: Temps d'exécution après modification de MADD64... 27 2011-2012 Page 4

I. Introduction Ce projet, mené sur 6 semaines, s est déroulé au sein du laboratoire IMS. Il consiste en l optimisation d un cœur de processeur en vue d applications spécifiques telles que la compression JPEG ou encore le décodeur MP3. Le but étant d optimiser les temps de calculs d un processeur plasma par modification de son jeu d instructions, l ajout d instructions assembleur passe par la description de fonctions combinatoires en VHDL destinées à améliorer les possibilités de l ALU (Unité arithmétique et logique). L optimisation d une telle architecture passe par la prise en main du système et des outils mis à disposition au cours de ce projet : l arborescence du cœur de processeur mais aussi un ensemble de testbench pour les différentes applications étudiées. L étude a été mené grâce à une virtualisation du système fourni par l encadrant permettant de réaliser le maximum de tests sans toutefois corrompre le système existant. En plus de saisir l architecture du système, il a fallu également prendre en main les différents algorithmes utilisés dans les applications ciblées. La raison de cette étude algorithmique sera développée plus tard dans ce rapport, après avoir présenté le système cible du projet. Une méthodologie sera également présentée sur l ajout d une nouvelle instruction avant de terminer par des aspects plus concrets avec deux applications directes : la compression JPEG et le décodeur MP3. 2011-2012 Page 5

II. Méthodes et choix de l optimisation 1. Présentation du processeur : a. Le projet plasma : Plasma CPU est un domaine public qui a été créé en 2001 par Steve Rhoads. Ce microprocesseur RISC 32-bits, implémenté en VHDL avec 2 ou 3 étages de pipeline, tourne à 25 MHz sur une carte Xilinx Spartan-3E FPGA. Avec un contrôleur d interruption, Contrôleurs UART, SRAM ou DDR SDRAM, et contrôleur Ethernet, ce processeur mène actuellement le serveur web «http://plasmacpu.no-ip.org:8080/» : Figure 1 : Carte Spartan 3E 2011-2012 Page 6

Figure 2: Plasma CPU site b. Architecture du processeur et schéma blocs : Le CPU est implémenté avec 2 ou 3 étages de pipeline, avec un étage supplémentaire pour la lecture et l écriture mémoire (read and write). Figure 3: Diagramme bloc 2011-2012 Page 7

Par exemple une instruction ADD (simple addition) va passer par les étapes suivantes : Etape 0 : - Le conteur programme va passer de l entité "pc_next" à l entité «mem_ctr» qui va chercher l opcode dans la mémoire. Etape 1: - La mémoire renvoie l opcode. Etape 2: - L entité " Mem_ctr" passe l opcode à l entité "Control". - "Control" converti l opcode en un opcode 60-bit et envoie les signaux de contrôle aux autres entités. - Basé sur les signaux de control "rs_index" et "rt_index", "reg_bank" envoie les "reg_source" et "reg_target" (codés sur 32 bits) au "bus_mux". Etape 3 : - Basé sur "a_source" et "b_source", "bus_mux" va multiplexer "reg_source" en "a_bus" et "reg_target" en "b_bus". - Basé sur "alu_func ", "alu" additionnes les valeurs de "a_bus" et "b_bus" et la place le résultat dans "c_bus". - Basé sur "c_source", "bus_mux" va multiplexer "c_bus" dans "reg_dest". - Basé sur "rd_index", "reg_bank" enregistre "reg_dest" dans le registre convenable. Etape 4 : - Ecrire ou lire dans la mémoire si nécessaire. c. Plasma et le jeu d instructions MIPS : - le jeu d instructions : Le jeu d instruction en général est l'ensemble des opérations qu un processeur d ordinateur peut exécuter, c'est-à-dire l'ensemble des circuits logiques qui y sont câblés. Ces circuits permettent d'effectuer des opérations élémentaires (addition, ET logique ) ou plus complexes (division, passage en mode basse consommation ). (RISC). On distingue en général le jeu d'instructions complexe (CISC) et jeu d'instructions réduit 2011-2012 Page 8

- L'architecture MIPS et le Plasma L architecture MIPS (en anglais : microprocessor without interlocked pipeline stages) est une architecture de processeur de type Reduced instruction set computer (RISC) développée par la société MIPS Technologies (alors appelée MIPS Computer Systems), basée à Mountain View en Californie. Les processeurs fabriqués selon cette architecture ont surtout été utilisés dans les systèmes SGI. On les retrouve aussi dans plusieurs systèmes embarqués, comme les ordinateurs de poche, les routeurs Cisco et les consoles de jeux vidéo. Le processeur Plasma est compatible avec toutes les instructions Mips 1. C'est-à-dire que tout programme compilé avec Mips1 peut être compilé avec le processeur Plasma. 2. Contexte du projet_s9 : Etant donné que le processeur Plasma ne contenant que les instructions standards de base, nous avons été amené dans le cadre de ce projet à apporter des améliorations à ce processeurs permettant d'optimiser son fonctionnement. a. Méthode d optimisation Comme il s agit d un processeur RISC, les instructions, simples par nature, sont exécutées en un seul cycle d'horloge. Donc pour rendre l'exécution des programmes de différentes applications (Compression JPEG, MP3..) plus rapide, on a choisi de l optimiser en lui rajoutant de nouvelles instructions. Cette opération va nous permettre de gagner en termes de temps d exécution. b. Moyens et outils mis à disposition : Le projet se déroule dans le laboratoire IMS où tout est mis en place. Le processeur Plasma sur lequel on va travailler est implanté sur un FPGA qui est relié à l ordinateur par un bus PCIE (PCI Express) comme le montre le schéma suivant : 2011-2012 Page 9

Figure 4: Equipements IMS - Bus PCIE Le PCI Express, abrégé PCI-E ou PCIe est un standard développé par Intel et introduit en 2004. Il spécifie un bus local série («bus PCI express») et un connecteur qui sert à connecter des cartes d extension sur la carte mère d un ordinateur. Il est destiné à remplacer tous les connecteurs d extension d un PC, dont le PCI et l AGP. Figure 5: Ports PCIe La principale raison d avoir utilisé le bus PCI EXPRESS pour dialoguer avec la carte est son débit. En effet, suivant les applications qui pourraient être inclus sur la carte, sa vitesse pourrait être un atout dans son utilisation. 2011-2012 Page 10

3. Choix de la méthode a. Objectif Le but de cette partie est de présenter de manière générale la méthode visant à ajouter une instruction au plasma puis de la mise en œuvre d une procédure de simulation. b. Identification des besoins Pour ajouter des instructions au processeur, on a besoin d un outil qui définit nos besoins en termes de redondances des instructions et le nombre de fois elles sont appelées. L outil Gprof est un des outils qui permet d'apprendre où le programme a dépensé son temps et combien de fois les fonctions étaient appelées. Cette information peut nous montrer quels éléments de notre programme sont plus lents que prévu, et peut-être utile pour la réécriture des programmes pour qu ils s exécutent plus rapidement. Il peut aussi nous dire quelles fonctions sont appelées plus ou moins souvent que prévu. Cela peut nous aider à repérer les bugs qui ont été par ailleurs inaperçus. Gprof est utilisé sur des programmes qui sont trop grandes ou trop complexes à analyser par la lecture de la source. Cependant, la façon dont le programme est exécuté aura une incidence sur l'information qui apparaît dans les données du profil. Si on n'utilise pas une caractéristique du programme pendant qu'il est profilé, aucune information de profil ne sera générée pour cette fonctionnalité. Pour se servir de cet outil, trois étapes sont à suivre : compiler et lier le programme avec un profilage actif. Cela se fait en ajoutant l option -pg au moment de la compilation. > gcc../source/*.c pg o fichier_à_exécuter. Exécuter le programme pour générer un fichier profile de données. Ce fichier sera appelé gmon.out. >. / fichier_à_exécuter Exécuter gprof pour interpréter les informations qui existe dans le fichier gmon.out. On peut mettre l option more pour avoir un affichage optimisé des fonctions appelées. >gprof fichier_à_exécuter 2011-2012 Page 11

Le résultat de cet outil doit rassembler au schéma ci-dessous : Figure 6: Outil Gprof c. Ajout d une instruction Ce projet a pour but l écriture d instructions machine en VHDL afin d optimiser les temps de traitement du processeur. Cette opération passe à la compréhension globale du système existant. En effet le cœur de traitement s appuie sur une architecture complexe basée sur une arborescence précise. On décrit ci-dessous le processus à suivre pour l ajout d une fonction VHDL. Ecriture de la fonction VHDL : Un répertoire spécifique est créé pour recueillir l ensemble des fonctions ajoutées lors de ce projet : c est le dossier : /home/legal/plasma_s9/vhdl/ims/s9. A l intérieur de ce dossier on ne va ajouter que des fonctions combinatoires, des calculs «élémentaires» ou plus simplement des calculs pouvant se réaliser sur un seul cycle d horloge. Ceci est fait dans l optique d une amélioration sensible des temps de calculs du processeur en remplaçant une suite de fonctions assembleurs par une opération nouvellement crée qui utilisera la description matérielle réalisée dans ce dossier. L opération codée dans cette partie doit se réaliser avec deux entrées de 32 bits et une sortie sur 32 bits. Une fois cette opération réalisée, il faut spécifier à l outil de calcul que la ressource, nouvellement créée, existe et est disponible. Cette opération passe par la modification du fichier «comb_alu1.vhd»(présent dans le répertoire /home/legal/plasma_s9/vhdl/ims/). On y retrouve la convention précitée de 64 bits en entrée et 32 bits en sortie (chaque module devant s adapter à ces ports d entrée/sortie). Plusieurs changements sont nécessaires dans ce fichier : La déclaration du nouveau composant. La création d un nouveau signal intermédiaire pour affecter le résultat du calcul réalisé. L affectation conditionnelle en fonction d un code d opération. 2011-2012 Page 12

A ce stade, notre fonction n est toujours pas effective. Il faut dire au fichier de control («control.vhd» dans le répertoire /home/legal/plasma_s9/vhdl) que notre fonction est effective. Pour ce faire on récupère le code d opération qu on a précédemment établi et on ajoute notre module comme suit (ici on a un exemple d un espace libre et d un espace où on a ajouté une fonction) : when "111010" => --X3C func_alu_comb_1 := func; when "111011" => --X3D a_source := A_FROM_REG_SOURCE; b_source := B_FROM_REG_TARGET; c_source := C_FROM_ALU; alu_function := ALU_NOTHING; shift_function := SHIFT_NOTHING; mult_function := MULT_NOTHING; func_alu_comb_1 := "000101"; Une fois ces opérations effectuées, il reste à modifier un fichier makefile dans le répertoire vhdl/build_dir. Il faut y déclarer le lien symbolique vers le module nouvellement créé (par exemple : $(VHDL_DIR)/ims/S9/SUM_32b.vhd \ ) Création de la fonction assembleur associée : A ce stade on a réalisé un bloc vhdl réalisant une opération mais on n a pas encore déclaré une nouvelle fonction assembleur. Pour ce faire il faut changer de «zone» de travail. On va modifier un fichier du compilateur afin de lui indiquer l existence d une nouvelle fonction. On se place dans le répertoire : /home/legal/build-scripts-20110201/work/binutils-2.21/opcodes et on modifie le fichier mips-opc.c. L ajout d une fonction se fait comme suit : {"sumc", "d,s,t",0x0000003d, 0xfc0007ff,WR_d RD_t RD_s, 0,I1} La liaison avec le fichier control.vhd se fait par le code hexadécimal (ici en rouge). Le nom de la fonction assembleur (ici en vert) doit s écrire uniquement en minuscule en utilisant le «.» comme séparateur pour éviter les problèmes par la suite. Une fois toutes ces opérations effectuées, il faut recompiler le noyau pour intégrer l ajout de la ou les nouvelle(s) instruction(s) machine («make && make install» dans le répertoire /home/legal/build-scripts-20110201/work/binutils-build). Test de la nouvelle fonctionnalité : Une fois qu on a ajouté la nouvelle fonction assembleur, il faut valider son fonctionnement. Pour cela un fichier est mis à notre disposition. Dans le répertoire /home/legal/plasma_s9/tools/test_asip, on modifie le fichier main.c afin d effectuer des test sur les opérations élémentaires que l on ajoute au cœur de processeur. Pour cela on crée des fonctions dans lesquelles on va appeler les fonctions assembleurs définies au préalable. Cet appel se présente comme suit : inline int instr_sumc(int a, int b){ int res; asm volatile ("sumc %0, %1, %2 \n\t" : "=r" (res) : "r" (a), "r" (b) ); return res; } 2011-2012 Page 13

Intégration de la fonction assembleur à la chaine de traitement : A ce stade la fonction assembleur est disponible et validée pour intégration dans la chaine de traitement souhaitée. On modifie le code source en fonction des besoins recensés dans le dossier correspondant (ces dossiers de test se trouvent dans /home/legal/plasma_s9/tools/). Après cette modification il faut recompiler la fonction main.c de ce dossier. Ceci génère un fichier «code.txt» qui est directement copié dans le répertoire /home/legal/plasma_s9/vhdl. Ce fichier servira à l élaboration d un testbench dans le dossier /home/legal/plasma_s9/vhdl/build_dir. L exécution du testbench ainsi généré va servir à quantifier l intérêt de la fonction assembleur développée à travers le temps d exécution affiché en fin de simulation. Remarques : Lors de la recompilation dans le dossier build_dir il est important de faire un «make clean» afin que les nouveaux paramètres soient pris en compte. La commande exacte à taper est : make clean && make simtest. Pour évaluer le gain réel il faudrait également faire une synthèse ISE et vérifier si le gain temporel a un rendement réel quant à l occupation spatiale de la fonction développée. 2011-2012 Page 14

III. La chaine de compression JPEG 1. Introduction La compression JPEG est une application très utilisée dans une grande partie des systèmes embarqués. Elle est constituée de plusieurs algorithmes permettant de compresser des données. Ces algorithmes sont très récurrents dans les applications de traitement du signal. La figure ci-dessous présente les différents blocs de la chaine JPEG : DataIN Conversio n Couleurs Quantificat ion DCT ZIGZAG RLE DataOut Figure 7:Présentation de la chaine JPEG La fonction conversion-couleurs permet de passer de la base des couleurs (R,G,B) à la base (Y,Cb,Cr). La fonction quantification consiste à diviser la matrice par une autre, appelée matrice de quantification, et qui contient 8 8 coefficients savamment choisis par le codeur. La fonction DCT définie la transformée de fourrier des différents données. La fonction ZIGZAG est une méthode qui permet de réarranger les données en balayant les matrices dans un ordre différent (zigzag) afin de maximiser la compression des données. La fonction RLE se charge de supprimer la redondance temporelle des informations et de la coder par un couple. 2. Etude du code des fonctions de la chaine JPEG En utilisant l outil gprof, on peut avoir une idée sur l utilisation de chaque fonction de la chaine JPEG et le temps mis par chacune d elle au cours de l exécution. La figure ci-dessous montre le résultat de compilation du programme à l aide de l outil gprof : Figure 8: Compilation de la chaine JPEG à l'aide de gprof 2011-2012 Page 15

On remarque que les fonctions qui mettent plus du temps à d exécuter sont les fonctions DCT, DCT RLE et Quantification. Les fonctions conversion-couleurs et conversion-couleurs-inverse sont les plus appelées. Donc le travail pour améliorer les performances du processeur consiste à chercher les redondances des instructions les plus couteuses au niveau temporel et essayer de les coder en une seule instruction pour le processeur. 3. Modification : iquantification La première instruction qu on a pu identifier est une instruction dans la fonction iquantification qui consiste à multiplier une matrice par une matrice constante comme on le voit cidessous : Ces lignes de codes permettent de faire 64 multiplications en utilisant 7 instructions à chaque fois. Donc l idée consiste de coder chaque multiplication en une seule instruction du processeur (dmult). En effet les variables tab et qtable sont de type short, donc codée chacune d elle en 16 bits. En jouant sur le fait que le processeur peur accepter deux entrées codées sur 32 bits et une sortie codée sur 32 bits, dmult va assurer une double multiplication tab[y] = tab[y] * qtable[y] et tab[y+1] = tab[y+1] * qtable[y+1] en ayant en entrée tab[i] et tab[i+1] codées en une seule variable de 32 bits et pareillement pour qtable[i] et qtable[i+1]. Ceci va permettre de gagner 384 périodes au niveau de l exécution comme montre le code ci-dessous : a. Définition de la fonction en VHDL : Le code VHDL de cette instruction est développé ci-dessous : 2011-2012 Page 16

b. Instruction dans le processeur : Figure 9: Code VHDL dmult Une fois le code VHDL est fait on ajoute l instruction au fichier mips-opc.c pour que le processeur en tienne compte : c. Test de l instruction : Figure 10: Insertion instructions dans le processeur Pour vérifier le bon fonctionnement de notre instruction et sa tenue-compte par le processeur, on a lancé un test qui permet de mettre à l entrée deux entiers et d afficher à la sortie de l instruction un entier qui permet de concaténer le résultat de multiplication des 16 bits de poids faible des deux entiers et la multiplication des bits de poids faible dans un seul entier de 32 bits comme on le voit ci-dessous : On peut bien vérifier que le processeur a bien tenu compte de la nouvelle instruction en regardant le code assembleur généré : Figure 11:code assembleur généré 2011-2012 Page 17

d. Résultats : L exécution de la chaine JPEG avec l ajout de la nouvelle instruction dmult met un temps de 2275830 ns, alors que son exécution initiale met 2353590 ns. Figure 12: exécution après l'ajout de l'instruction Figure 13: exécution avant l'ajout de l'instruction Ceci permet de gagner 77760 ns à chaque appel de la fonction iquantification. 4. Modification : RLE La deuxième instruction qu on peut ajouter au processeur est l instruction qui se trouve dans la fonction RLE. Cette instruction consiste à remplir le tableau à la sortie de la fonction : Cette ligne de code est appelée jusqu'à 64 fois et utilise à chaque fois 4 instructions. La solution consiste à mettre en entrée deux variables cpt et last codée chacune d elle sur 16 bits et en sortie la variable out. Ce qui nous permet de coder la ligne en un seul cycle d horloge comme précisé ci-dessous : a. Définition de la fonction en VHDL : Le code VHDL de cette instruction est développé ci-dessous : Figure 14: Code VHDL de l'instruction outrle 2011-2012 Page 18

b. Instruction dans le processeur : Une fois le code VHDL est fait on ajoute l instruction au fichier mips-opc.c pour que le processeur en tienne compte : c. Test de l instruction : Pour tester cette instruction, on a fait le même test que dans l autre instruction et le résultat affiché valide notre raisonnement : On peut bien vérifier que le processeur a bien tenu compte de la nouvelle instruction en regardant le code assembleur généré : d. Résultats : Figure 15: code assembleur généré L exécution de la chaine JPEG avec l ajout de la nouvelle instruction outrle met un temps de 2275830 ns, alors que son exécution initiale met 2353590 ns. Figure 16: exécution avant l'ajout de l'instruction Figure 17 : exécution après l'ajout de l'instruction Ceci permet de gagner 23400 ns à chaque appel de la fonction RLE. 2011-2012 Page 19

IV. Décodeur MP3 1. Présentation : Le MPEG-1/2 Audio Layer 3, plus connu sous son abréviation de MP3, est la spécification sonore du standard MPEG-1/MPEG-2, du Moving Picture Experts Group (MPEG). C'est un algorithme de compression audio capable de réduire drastiquement la quantité de données nécessaire pour restituer de l'audio, mais qui, pour l'auditeur, ressemble à une reproduction du son original non compressé : avec une bonne compression la différence de qualité devenant difficilement perceptible. Le but de cette partie est donc de créer de nouvelles instructions dans le but d accélérer la vitesse de décompression qui pourrait un problème dans certaines applications et de limiter le pourcentage de temps CPU. 2. Etude du système : Avant de commencer à créer de nouvelles instructions, il est important de connaitre le système à améliorer. Pour cela, nous avons lancé une première exécution pour nous indiquer le temps que le programme met pour s exécuter intégralement. Figure 18: Temps exécution sans modification La photo ci-dessus nous montre que le programme se termine après un peu moins de 48 ms. Maintenant, il suffit de terminer les fonctions du programme qui sont exécutées le plus de fois ou qui prennent le plus de temps. En effet, s il est possible de gagner quelques microsecondes sur une fonction qui est appelée plus de mille fois, le résultat pourrait en être bien intéressant. L outil Gprof permet d avoir une idée sur l utilisation de chaque fonction du décodeur MP3 et le temps mis par chacune d elle au cours de l exécution. La figure ci-dessous montre le résultat de compilation du programme à l aide de l outil Gprof : 2011-2012 Page 20

Figure 19: Temps d'exécution des fonctions à l'aide de l'outil Gprof La figure ci-dessus nous présente les principales fonctions du décodage MP3 qui prennent le plus de temps ainsi que le nombre de fois ou elles sont appelées. Comme nous pouvons le constater 2 fonctions méritent une attention particulière : MADD64 et MULSHIFT32 En effet, leur nombre d appels est très important par rapport aux autres fonctions du programme. Nous avons plus de 18 millions d appels pour la fonction MADD64 (ce qui représente 25% du temps du programme) et plus de 4 millions pour la fonction MULSHIFT32. Pour information, si nous pouvons diminuer le temps d exécution de 10ns pour MADD64, cela nous ferai gagner 10 ms. Nous allons donc, par la suite, essayer de créer ou modifier des instructions dans un but d optimisation et de gain de temps pour l exécution du programme. 2011-2012 Page 21

3. Modification : MULSHIFT32 La fonction MULSHIFT32 est une fonction permettant de multiplier deux variables de 32bits et de ne récupérer que les bits de poids fort. Le code permettant de réaliser cette fonction est défini ci-dessous : static inline int MULSHIFT32_old(int x, int y) { y = y >> 2; int64 r = ( int64)x * ( int64)y; r = r >> 30; return (int)r; } Nous remarquons que pour réaliser cette fonction, il est nécessaire de faire une multiplication, de faire un décalage et de redimensionner la donnée avant de la renvoyer. Le but est de remplacer c est 3 instructions. Décalage, multiplication et de nouveau décalage en une seule instruction. L implantation du processeur plasma sur un FPGA va nous permettre de créer de nouvelles instructions en langage VHDL utilisable par le processeur. a. Instruction dans le processeur : Tout d abord, il est nécessaire de nommer la nouvelle instruction qui va être utilisée par la suite dans le code de décodeur MP3. Nous allons donc appelé cette nouvelle instruction «mul_32msb» comme définie ci-dessous : Figure 20: Détermination de la nouvelle instruction b. Définition de la fonction en VHDL : Après avoir indiqué au processeur le nom de la fonction, il nous reste plus qu à la définir afin qu elle réalise la fonction désirée. Le code VHDL ci-dessous nous montre le code VHDL permettant de réaliser la multiplication et la récupération des 32 bit de poids fort. Cependant, les fonctions décrites en VHDL ne pourront prendre que 2 données de 32 bit et entrée et 1 donnée de 32 en sortie. 2011-2012 Page 22

Figure 21: Description de l'instruction VHDL de mul_32msb Maintenant que notre nouvelle instruction est définie, il nous suffit de l utiliser dans la fonction MULSHIFT32 et de constater si ce changement nous a permis de gagner du temps dans l exécution du programme. c. Test de l instruction : Après modification, nous remarquons que l opération précédemment réalisée en 3 instructions se réalise en une seule fois à l aide de la nouvelle instruction : mul_32msb static inline int MULSHIFT32(int x, int y) { int res; asm volatile ("mul_32msb %0, %1, %2 \n\t" : "=r" (res) : "r" (x), "r" (y) ); return res; } Le code assembleur ci-dessous nous montre bien l utilisation de la fonction mul_32msb dans le décodage Mp3 et sa réalisation en 1 seule ligne assembleur. 2011-2012 Page 23

Figure 22: Code assembleur correspondant à la modification d. Résultats : Après avoir créée la nouvelle instruction, nous allons maintenant voir si ce changement nous a apporté un gain de temps dans le Décodeur MP3. Pour cela, nous avons lancé une exécution pour nous indiquer le temps que le programme met pour s exécuter intégralement. Figure 23: Temps d'exécution après modification de MULSHIFT32 La photo ci-dessus nous montre que le programme se termine après un peu près 37 ms. Nous avons donc gagné 10 ms (soit 21%) en ne rajoutant qu une nouvelle instruction et en l utilisant seulement dans une fonction. 2011-2012 Page 24

4. Modification : MADD64 La fonction MADD64 est une fonction permettant de multiplier deux variables de 32bits et d additionner ce résultat avec une autre variable. Le code permettant de réaliser cette fonction est défini ci-dessous : static inline int64 MADD64( int64 sum, int x, int y) { int64 mul = (( int64)x * ( int64)y); sum = sum + mul; return sum; } Nous remarquons que pour réaliser cette fonction, il est nécessaire de faire une multiplication et une somme. Pour la multiplication nous allons utiliser la fonction précédemment définie : mul_32msb. Cependant pour la somme 64 bits, nous allons réaliser comme précédemment une fonction «mul_32lsb» qui va réaliser une multiplication de 2 données de 32 bit et ne renvoyer que le 32 bit de poids faible car, comme nous l avons indiqué pour MULSHIFT32, les instructions que nous créons ne peuvent prendre que 2 données de 32 bit en entrée et 1 donnée de 32 bit en sortie. Nous réaliserons aussi une fonction faisant la somme de 2 données de 32 bits. a. Définition de la fonction en VHDL : Après avoir indiqué au processeur le nom de la fonction (mul_32lsb et sum), il nous reste plus qu à les définir afin qu elle réalise la fonction désirée. L instruction «mul_32lsb» ne sera pas décrite car elle est identique à mul_32msb. La différence est que «mul_32lsb» ne revoie que les 32bits de poids faible et non les 32 bit de poids fort. Le code VHDL ci-dessous nous montre le code VHDL permettant de réaliser l addition de 2 données de 32 bit : Figure 24: Description de l'instruction VHDL de sum 2011-2012 Page 25

b. Test de l instruction : Après modification, nous allons tester notre programme en ayant implanté nos 2 nouvelles instructions ainsi que celle défini précédemment. Voici la définition de la nouvelle fonction MADD64 décrites à l aide des nouvelles instructions. union Uni{ long long a; int b[2]; }; static inline int64 MADD64( int64 sum, int x, int y) { union Uni toto; toto.a = sum; int MulMSB; int MulLSB; asm volatile ("mul_32msb %0, %1, %2 \n\t" : "=r" (MulMSB) : "r" (x), "r" (y) ); asm volatile ("mul_32lsb %0, %1, %2 \n\t" : "=r" (MulLSB) : "r" (x), "r" (y) ); ); ); asm volatile ("sum %0, %1, %2 \n\t" : "=r" (toto.b[0]) : "r" (MulLSB), "r" (toto.b[0]) asm volatile ("sum %0, %1, %2 \n\t" : "=r" (toto.b[1]) : "r" (MulMSB), "r" (toto.b[1]) return toto.a; } La petite astuce est d utiliser une union pour pouvoir partager le même espace mémoire avec 2 variables pour pouvoir stocker le résultat de la somme 2011-2012 Page 26

c. Résultats : Après avoir créé la nouvelle instruction, nous allons maintenant voir si ce changement nous a apporté un gain de temps dans le Décodeur MP3. Pour cela, nous avons lancé une exécution pour nous indiquer le temps que le programme met pour s exécuter intégralement. Figure 25: Temps d'exécution après modification de MADD64 La photo ci-dessus nous montre que le programme se termine après un peu près 9 ms. Nous avons donc gagné 38 ms (soit 80%). Le résultat est exceptionnel car en ne rajoutant 3 nouvelles instructions nous arrivons à faire baisser considérablement le temps d exécution du programme. 2011-2012 Page 27

V. Conclusion Ce projet nous a permis de toucher de près un SOPC complet ayant comme processeur l OpenCore Plasma. Dans le but d optimiser les performances de ce processeur en termes de temps d exécution, on a été amené à rajouter de nouvelles instructions machine en VHDL. Cette opération passe à la compréhension globale du système existant d architecture complexe. La méthode suivie s est basée sur l étude du code déjà existant afin de rechercher les redondances et trouver un moyen pour remplacer des lignes de code par une seule instruction machine et ainsi gagner en termes de temps d exécution. Certes les instructions ajoutées nous ont permis de gagner un temps remarquable, mais ce résultat n était confirmé que par simulation. On devrait tester les nouvelles fonctionnalités en les implémentant sur la carte et ainsi analyser le comportement réel des programmes sur la plateforme existante. L étape suivante consisterait à conclure au niveau du compromis entre le gain en termes de temps d exécution et la perte au niveau de l occupation matérielle par les instructions ajoutées. Pour finir, nous tenons à remercier notre encadrant pour nous avoir aidé dans ce projet. 2011-2012 Page 28