• Aucun résultat trouvé

4.3 Implémentation du processeur de calcul

4.3.2 Définition du jeu d’instructions

Le jeu d’instructions (Instruction Set) est la partie du processeur qui est rendue visible au programmeur. Nous avons défini un jeu d’instructions suffisamment modulaire pour pouvoir l’adapter aux besoins des appli- cations et aux contraintes architecturales. Pour cela, nous nous basons sur le choix des opérateurs permettant de couvrir les applications de traitement d’image comme nous l’avons fait précédemment. Toutes les instructions du processeur SplitWay s’exécutent en un seul cycle processeur.

Comme le processeur implémenté est un processeur VLIWdeux voies, les instructionsVLIWsont compo- sées de deux « instructions simples » concaténées, chacune correspondant à une opération. Nous ne décrirons ici que le format des « instructions simples » qui est identique pour chacune des voies, puis nous édicterons les règles de leur utilisation sur deux voies.

4.3.2.1 Définition des instructions utilisateurs

• Les opérations Comme l’instruction sert avant tout à demander au processeur d’exécuter une opération, le champ principal désigne l’opération que nous nommeronsOP. Il peut, par exemple, prendre les valeurs de la liste non exhaustive qui suit:

– LD: copie d’une donnée dans un registre; – ADD: addition;

– SUB: etCMPsoustraction; – MUL: multiplication;

– STR: écriture dans le plan mémoire (adresse stockée dans un registre); – SHIFTR: etSHIFTLdécalage à droite et à gauche;

– CMP: comparaison; – JMP: saut;

– AND: ET bit à bit; – OR: OU bit à bit;

– NOP: attente d’un cycle processeur.

La plupart de ces instructions utilisent des opérandes (à l’exception deNOP) et génèrent un résultat. Pour Pour générer ce résultat, il est nécessaire d’avoir des données sur lequelles opérer, c’est pourquoi nous avons prévu différents arguments au mot d’instruction.

• Les arguments -DEST Le premier argument est le numéro du registre où sauver le résultat de l’opé- ration. Il est codé dans le champDESTdont la taille en bits est donc au moins le log2 du nombre de registres.

Dans le cas de l’opération STRqui sauvegarde une valeur en mémoire externe, ce champ permet de stocker le numéro du registre contenant l’adresse où écrire. Certaines opérations ne nécessitent pas la sauvegarde d’une valeur dans un registre, comme par exemple la comparaison CMP, dans ce cas, sa valeur n’est pas utilisée.

• Les arguments -A La plupart des instructions ont besoin d’un ou plusieurs arguments sur lesquels opérer. Le champApermet de coder le numéro du registre dans lequel est stocké la valeur du premier opérande. Ce champ est de la même taille que le champDEST, pour les même raisons liées au nombre de registres. Avec les champs que nous avons présentés, il est possible de traiter les opérations unaires (incrément, décrement etc.) Notons par ailleurs queA peut être le même registre queD, l’opération sera exécutée sur la valeur du registre deA, puis remplacée ensuite.

• Les arguments -B Afin de traiter des opérations binaires utilisant deux opérandes, il est nécessaire d’introduire un champ supplémentaire B. Comme le champDESTetA, il code le numéro du registre du second opérande, avec les mêmes contraintes sur sa taille que celles du champA. Toutefois, Avec ces champs, seules les opérations de registre à registre sont possibles. Or, nous avons vu précédemment qu’il est essentiel de pouvoir utiliser des données externes, comme celles disponibles dans les registres de voisinages.

4.3. Implémentation du processeur de calcul 91

• Accès aux données Aussi, avons-nous défini l’un des deux opérandes comme orthogonal, en l’occur- renceB, c’est à dire que sa valeur peut être indifféremment issue d’une source externe ou de la file de registres. La méthode que nous avons conçue et employée ici reste extensible àAmais au prix d’une augmentation de la taille du mot d’instruction et de la surface silicium, rédhibitoire au regard de l’augmentation des performances apportées. Pour ce mode d’accès, un champ supplémentaire appelé A_Source est introduit ce qui permet de coder la source de la donnée. Ce champ peut, par exemple, prendre une des valeurs suivantes :

– Rpour une donnée issue de la file de registres;

– Cpour une donnée constante issue du mot d’instruction; – Vpour une donnée issue du gestionnaire de voisinages; – Ppour une donnée issue d’un processeur voisin; – Mpour une donnée issue du plan mémoire;

– Bpour une donnée issue d’un résultat d’une instruction précédente; – Dpour une valeur d’un des drapeaux1 permettant de gérer les conditions; – e1,e2àeNpour des données issues d’une des N entrées disponibles.

Ces champs supplémentaires permettent de sélectionner une donnée parmi les entrées du processeur Split- Way. Il est souvent nécessaire d’adresser une valeur de ces entrées. Par exemple, lorsque le programmeur choisit l’entrée correspondant au gestionnaire de voisinages en précisantVcomme source de données, il lui est néces- saire de transmettre les coordonnées du voisinage à lire.

Prenons par exemple le cas où le gestionnaire de voisinages gère des voisinages 15× 15. Le programmeur

pourra souhaiter lire le pixel haut gauche (soit le pixel de coordonnées(−7, − 7)). Ces valeurs sont transmises

directement dans le mot d’instruction, ce qui lui permet d’avoir dans le même cycle toutes les informations nécessaires pour lire les données. Pour cela, plutôt que d’ajouter un champ supplémentaire, nous avons choisi d’étendre le champB(aussi utilisé pour coder le numéro de registre de l’opérandeB). Sa nouvelle taille dépend du nombre de données qui doivent être adressées.

Par exemple une taille de 7 bits autorise l’accès à des matrices de voisinages 11× 11 tandis que 8 bits

permettent d’accéder à des matrices de taille 16×16. Comme cet exemple d’accès aux voisins le montre, la taille

du champBimpose la limite de l’espace externe qu’il est possible d’adresser en lecture. C’est pourquoi nous avons intégré la possibilité d’utiliser des valeurs de la file de registres en tant qu’adresses. Pour implémenter cette méthode, nous avons choisi de considérer que la partie basse du champBcontient le numéro d’un registre dans lequel est stockée l’adresse à considérer, si son bit le plus significatif est placé à 1. Pour ne pas intégrer un bit supplémentaire au champB, il est possible de n’utiliser que la moitié de la file de registres pour adresser des valeurs externes. Par exemple, si,Bà une taille de 5 bits, et que l’on souhaite signaler que la valeur du voisin à accéder est stockée dans le registre numéro 3, le champBprendra les valeurs suivantes « 1 0011

| {z } Valeur du registre

».

De plus, un registre spécial accessible est utilisé comme adresse de base pour tout accès au plan mémoire. Sa valeur est systématiquement ajoutée à l’adresse demandée, qu’elle soit dans le champBou issue de la file de registres. De plus, nous avons ajouté un registre spécial dont la valeur est systématiquement concaténée à celle du champB lorsqu’il s’agit d’adresser des valeurs. Cette méthode nous permet d’accéder à des espaces d’adresses dont la taille dépasse la dynamique des registres.

Gestion des métadonnées Nous avons vu qu’il était possible d’extraire de manière transparente des métadonnées qui sont stockées au sein d’un mot de données. Pour cela, plusieurs registres de masques de données correspondant à toutes les métadonnées disponibles sont configurés par le programmeur au niveau de la tuile de calcul. Le programmmeur réalise ensuite les accès aux données à l’aide d’un de ces masques. Il lui suffit d’associer le numéro du masque à utiliser sur l’opérande. L’utilisation de ces métadonnées permet en outre de travailler sur des mots de données de taille plus importante que celle du chemin de données, puisqu’ils peuvent être décomposés en plusieurs champs qui peuvent être traités séparément. Le support des métadonnées permet au programmeur de définir une partie entière et une partie décimale, ou encore une partie réelle et une partie imaginaire pour ses données.

Trois champs supplémentaires sont introduits pour adresser ces masques (un par opérande), A_fmt pour la première opérande A, B_fmt pour la seconde opérande et Res_fmt pour le résultat Res. Il est envisageable d’utiliser le même masque pour les deux opérandes, et un pour le résultat, réduisant alors la taille du mot d’instruction. Au niveau du langage assembleur, le numéro du masque à utiliser est associé à la notation pointée (aucune valeur signifie que l’ensemble des bits est à exploiter). Par exemple, en tant qu’opérande, R2.4 fait référence au registreR2, pour lequel la métadonnée est extraite grâce au masque 4. S’il est utilisé en tant que registre, alors seuls les bits de cette métadonnée seront écrits enR2en conservant les autres parties du registres.

Instructions conditionnelles Nous avons maintenant la possibilité d’exécuter des instructions séquentiel- lement et d’utiliser des sauts. Toutefois, afin de traiter les instructions de typeIF/ELSEou encore lesCASE, il est nécessaire de supporter des instructions conditionnelles. C’est pourquoi nous avons introduit la notion de drapeau ainsi que des champs pour coder des conditions.

Les drapeaux sont constitués de NbDrapeaux bits que le programmeur peut positionner sur le résultat d’une instruction de son choix. Il peut ensuite utiliser leur valeur pour conditionner l’exécution de ses instructions. Pour cela, il est prévu de permettre le positionnement àVRAIdes drapeaux dans les cas suivants :

– MZsi le résultat précédent est un zéro; – MNZsi le résultat précédent n’est pas un zéro; – MSsi le résultat précédent est supérieur à zéro; – MNSsi le résultat précédent est inférieur à zéro; – MCsi le résultat précédent génère une retenue; – MNCsi le résultat précédent ne génère pas de retenue; – MOs’il y a dépassement de capacité sur le résultat précédent; – MNOs’il n’y a pas dépassement de capacité sur le résultat précédent.

Le champ appeléCxPosDrappermet de coder les choix de position des drapeaux, tandis qu’un champNumDrap

permet de coder le numéro du drapeau à mettre à jour. Sa taille en bits est d’au moins de log2(NbDrapeaux).

Ils conservent leurs valeurs tant qu’ils ne sont pas explicitement repositionnés par le programme. Par ailleurs le champCxPosDrappermet de coder les choix de position des drapeaux. Dans notre cas, sa taille est de 3 bits, puisqu’il sert à coder les huit choix listés précédemment.

Nous avons maintenant permis au programme de positionner des drapeaux àVRAIsur le résultat d’une opé- ration. Afin de les exploiter pour rendre l’exécution des instructions conditionnelles, deux champs supplémen-

4.3. Implémentation du processeur de calcul 93

taires sont ajoutés pour rendre conditionnelles les opérations. Le premierNumDrapExest le numéro du drapeau qui la conditionne. Le secondCondExcode la condition à exploiter, c’est à dire :

– VRAIexécute l’opération si le drapeau est positionné àVRAI; – FAUXexécute l’opération si le drapeau est positionné àFAUX;

– Aucune précision permet d’exécuter l’opération quelle que soit la valeur du drapeau.

Dès lors, il est possible d’exécuter des instructions conditionnelles, y compris lorsque plusieurs niveaux d’im- brications sont en jeu.

Jeu d’instructionsVLIW2 voies Le processeur SplitWay est un processeur VLIWdeux voies, ce qui signifie que deux instructions telles que celles décrites précédemment peuvent être exécutées en parallèle. Comme l’ensemble des ressources sont indifféremment accessibles entre les deux voies (la file de registres, les drapeaux, les opérateurs, etc.), il est nécessaire de définir des règles de programmation permettant d’assurer leur bon fonctionnement. Ainsi, pour deux instructions destinées chacune à une voie, i et j qui s’exécutent simultanément, il est nécessaire de veiller au respect des règles édictées ci dessous en4.9:

DESTi Opi ... NumDrapi DESTj Opj ... NumDrapj

(4.9) 1. écrire dans le même registre est interdit donc DESTi6=DESTj;

2. assigner le même drapeau sur les deux voies est interdit doncNumDrapi6=NumDrapj; 3. l’utilisation de la même instance d’un même opérateur simultanément est interdit.

Si malgré les outils logiciels ces règles ne sont pas respectées, la première voie (la voie i) du processeurVLIW

est prioritaire sur la seconde (la voie j). Par ailleurs, lorsque les instructions conditionnelles sont utilisées, l’écriture de deux instructions utilisant les mêmes ressources est permise comme par exemple le traitement d’unIF/ELSEdurant le même cycle processeur.

Exemple d’utilisation du jeu d’instructions Le premier exemple consiste à binariser une image, et à transmettre l’information en tant que métadonnée au pixel. Le format de la donnée d’entrée est un mot sur lequel le pixel est codé sur les 8 bits de poids faible. Le mot de donnée de sortie est un mot composite, où les 8 premiers bits donnent la valeur du pixel et un bit supplémentaire de métadonnée contient la valeur seuillée de l’image. La version séquentielle et la version SplitWay de cet algorithme simple sont présentés en Figure4.8.

Cet algorithme peut être décrit sur les deux voies comme le montre la seconde partie de cette même figure. Si la condition (comparaison du seuil) est vraie, le drapeau numéro « 0 » est positionné àVRAI. Alors la pre- mière voie traite l’opération grâce au mot clé VRAI F0qui vérifie l’état du drapeau « 0 ». La seconde voie est inhibée, puisque la condition pour qu’elle s’exécute est que le drapeau soit positionné àFAUX. Dans le cas où la condition est fausse, alors la condition inverse est exécutée. Il est donc possible de traiter dans le même cycle une instructionIF/ELSE.

Dans cet exemple, l’utilisation des métadonnées supprime toute opération logique, ainsi ce traitement qui nécessiterait cinq à six instructions et autant de registres, est décrit en trois cycles, dont un dédié à l’initialisation d’une constante, et un seul registre est utilisé.

1: seuil=128

2: if Pixel(0,0) = seuil then 3: Bin = 0

4: else 5: Bin = 1 6: end if 7: Bin = Bin « 9

8: Sortie = Pixel OR Bin

Initialisation : Traitement : 1: - - CMP - V[0,0].1 R2 F0 2: VRAI F0 LD R1.2 0 - - Métadonné 1 : 0b0...011111111 Métadonné 2 : 0b0...100000000 LDc R2 128 ; pixel ; pixel binarisé ; Valeur du seuil

Donnée issue du voisinage [0,0] métadonnée 1 extraite

Ecriture du résultat dans R1 sur le champ de la métadonnée 2

- - LD R1.1 V[0.0].1 - - FAUX F0 LD R1.2 1 - - - Valeur de la binarisation Voie N°1 Voie N°2 Drapeau conditionnél (résultat de CMP)

FIG. 4.8:EXEMPLE D’UN ALGORITHME DE BINARISATION,LA PARTIEIFEST RÉALISÉE SUR LA PREMIÈRE VOIE,

TANDIS QUE LA PARTIEELSEEST RÉALISÉE SUR LA DEUXIÈME VOIE. LA MÉTADONNÉE2PERMET D’ENREGISTRER

LA VALEUR DU BIT CONJOINTEMENT À LA VALEUR DU PIXEL.