Wikipédia extraits sélectionnés
Le partitionnement logiciel/matériel consiste à diviser les fonctions d'un système informatique entre celles qui seront exécutées par un logiciel classique et celles qui seront réalisées par un matériel spécifique. On parle de co-design, la conception est double, une conception logicielle et une conception matérielle.
Un système informatique est généralement constitué d'un logiciel destiné à la réalisation de différentes tâches. Ce logiciel est exécuté par un matériel généraliste, c'est-à-dire conçu indépendamment de la fonction réalisée. Dans certains cas, par exemple lorsque le système informatique est un téléphone portable, un décodeur numérique ou encore dans une carte à puce, le rôle respectif du logiciel et du matériel peut-être redéfinit. Il s'agit alors, le plus souvent, d'améliorer les performances et la rapidité d'exécution des tâches, en mettant à profit des matériels spéciaux.
Dans une démarche de définition du partitionnement logiciel/matériel, l'objectif est de réfléchir aux différentes actions que peut réaliser le matériel afin d'alléger le logiciel tout en tenant compte des contraintes de coût, des bénéfices sur le plan des performances et des limites intrinsèques à toute implantation matérielle d'un traitement automatique.
...
Si on parcourt les différents travaux de recherche qui ont déjà été réalisés sur le partitionnement logiciel/matériel, on remarque qu'il traite surtout des systèmes embarqués et aussi des systèmes embarqués en temps réels. Un système embarqué est un système électronique spécifique comme un téléphone mobile ou un lecteur mp3, conçu pour effectuer des tâches spécifiques avec des ressources limitées et des contraintes variées (consommation d'énergie, espace mémoire restreints, ...)1
Le partitionnement d'un système entre le matériel et le logiciel a une importance critique car il est le premier impact sur le coût et la performance du système applicatif final2. Le fait de diviser les processus applicatif entre le matériel et le logiciel surmonte les traditionnels problèmes de temps et de consommation (Cela permet de gagner du temps lors de l'exécution d'un programme et d'économiser les ressources utilisées par un logiciel en effectuant une partie du travail au niveau matériel)3.
Les méthodologies de partitionnement font appels à des systèmes possédant une architecture reconfigurable, CAD, une architecture avec du matériel pouvant être configuré pour qu'il soit plus adapté aux tâches qu'on souhaite lui confier. Dans cette optique, les systèmes les plus utilisés, sont ceux qui placent la logique reconfigurable à l'intérieur du cœur de processeurs ou l'inverse, comme par exemple, les systèmes CSoC (Configurable System on Chip), RSoC (Reconfigurable System on Chip), SoPC (System on Programmable Chip), SoRC (System on Reconfigurable Chip). Contrairement aux architectures ayant une unité reconfigurable qui est connectée à un processeurs hôte, ces systèmes permettent de faire face aux problèmes de performances qui restent souvent limitées par les délais de communication et de reconfiguration4.
Le partitionnement logiciel/matériel ouvre de nouvelles perspectives pour le développement de produits qui consomment peu d'énergie mais qui sont très rapides comme les applications embarquées (lecture de la puce de carte bancaire avec chiffrement et déchiffrement des informations), la communication, le multimédia (encodage de vidéos, traitement de photos) et les systèmes de transports intelligents5.
Un algorithme peut être implémenté en matériel (utilisant un Application-specific integrated circuit (ASIC)) ou en logiciel en utilisant un micro-processeur. Un ASIC est très rapide et efficace mais il n'est pas destiné à un usage général. Une fois, un ASIC optimisé pour un travail donné, il ne peut plus être reconfiguré. Une solution plus flexible est d'implémenter l'algorithme comme un ensemble d'instructions qui peut être exécuté par un micro-processeur. Sans altérer le matériel, le micro-processeur peut être reprogrammé en changeant l'ensemble d'instructions. Cependant le micro -processeurs doit lire et décoder chaque instruction ce qui induit une surcharge significative. Le matériel reconfigurable combine la flexibilité des micro-processeurs avec la vitesse des ASICs. Le matériel reconfigurable le plus utilisé est FPGA dont la propriété la plus importante est qu'un tel matériel peut être utilisé pour créer des circuits spécifique à l'application qui peuvent accroitre les performances des CPU habituels. De plus cela permet de gagner en vitesse d'exécution. Le matériel reconfigurable est utilisé comme base pour construire des ordinateurs reconfigurables. Les ordinateurs reconfigurables font référence à la possibilité de reconfiguré à la demande un matériel qui avait été auparavant configuré pour une tâche spécifique. Avec ce concept vient l'idée d'augmenter le but général d'un processeur avec des matériaux reconfigurables. De cette manière, des parties logiciels peuvent être accélérées en matériel6. Finalement, il est possible de distinguer deux types de reconfigurabilité :
La reconfiguration en général offre d’énormes opportunités, sur le plan des performances, du fait qu’elle permet d’adapter plus étroitement le composant matériel à la nature du traitement, et sur le plan de l'adaptabilité (flexibilité) du fait qu’elle permet de réagir à des stimuli venant :
Dans le cadre du partitionnement logiciel/matériel, l’architecture peut contenir plusieurs cœurs basés sur différents modèles de traitement et qui participent à l’exécution de l'application. Les parties critiques d’une application sont identifiées puis affectées à un cœur de traitement spécial ou reconfigurable, afin d’en accélérer le traitement.
En tirant parti des propriétés respectives des systèmes programmables et des systèmes reconfigurables il est possible d’améliorer l’adéquation du système global avec l’application développée. C'est l'un des principes de l'approche "plateforme" qui privilégie la généricité et la flexibilité. Dans une approche mixte, le partitionnement de l’application influence le niveau de couplage entre le processeur et le coprocesseur.
La finesse du partitionnement fixe le degré de communication nécessaire entre chaque partie8 .
Il existe trois modes de couplage d’une ressource reconfigurable avec un processeur. Le premier mode consiste à coupler la partie reconfigurable avec le processeur comme un périphérique. Les échanges s’effectuent par l’intermédiaire du bus d’entrées/sorties à l’aide, par exemple, d’accès DMA (Direct Memory Access). Le temps de latence est élevé, mais la bande passante disponible assure une alimentation efficace de la ressource reconfigurable. Les traitements peuvent s’effectuer en recouvrement avec ceux du processeur.
Il est possible aussi de coupler directement le processeur et l’accélérateur matériel reconfigurable via un bus local, c’est le second mode. Après reconfiguration, le reconfigurable manipule les données stockées dans la mémoire du processeur, sans intervention du processeur.
Le troisième mode de couplage est direct : le processeur et l’accélérateur sont intégrés sur la même puce de silicium. La ressource reconfigurable est placée dans les chemins de données internes du processeur ce qui minimise le temps de latence8.
Article détaillé : Circuit logique programmable.
Un FPGA (field-programmable gate array, réseau de portes programmables in situ) est un matériel composé de blocs logique et d'un réseau de routage. Un bloc logique est de manière générale constitué d'une table de correspondance (LUT ou Look-Up-Table) et d'une bascule (Flip-Flop en anglais). La LUT sert à implémenter des équations logiques ayant généralement 4 à 6 entrées et une sortie. Elle peut toutefois être considérée comme une petite mémoire, un multiplexeur ou un registre à décalage. Le registre permet de mémoriser un état (machine séquentielle) ou de synchroniser un signal (pipeline). Les blocs logiques, présents en grand nombre sur la puce sont connectés entre eux par une matrice de routage configurable. Ceci permet la reconfiguration à volonté du composant, mais occupe une place importante sur le silicium et justifie le coût élevé des composants FPGA9.
Dans le cadre du matériel reconfigurable, comme vu plus haut, il existe un type de circuit qu'il est possible de configurer en fonction de la tâche. On parle alors de circuit logique programmable (FPGA). Il existe deux types de technologies pour ce genre composant reconfigurable selon que la configuration est effectuée en utilisant des éléments Anti-Fuse ou des mémoires SRAM. La technologie Antifuse utilise un fort courant électrique pour créer la connexion entre deux fils et est généralement non-reprogrammable. La technologie basée sur les SRAM permet de reconfigurer le composant en chargeant différents bits de configuration dans les cellules mémoire SRAM10.
Résoudre le problème de partitionnement avec un tel système peut être effectué en plusieurs étapes :
La granularité d’un composant reconfigurable représente la taille du plus petit élément fonctionnel. Les FPGAs ont typiquement une faible granularité avec des unités fonctionnelles à deux ou à quatre entrées (bien qu’il existe des architectures de FPGA intégrant des multiplieurs sur des mots de 18 bits). D’autres architectures reconfigurables implémentent des unités arithmétiques à plus gros grain (32 bits pour le Chameleon par exemple, pour plus d'informations, le site de l'architecture Chameleon est en lien externe). Typiquement, un composant reconfigurable est configuré en chargeant dans celui-ci une séquence de bits (ou bitstream). Le temps de chargement est directement proportionnel à la taille de la séquence. Les architectures à gros grain nécessitent des séquences plus courtes que les architectures à grain fin donc un temps de configuration plus faible. Une faible granularité procure une plus grande flexibilité d’adaptation du matériel à la structure de calcul souhaitée mais elle entraîne un temps de configuration important. De plus, le grand nombre d’interconnexions entre les unités rajoute un délai conséquent à l’exécution du module implanté (malgré des structures permettant de réduire ce délai, comme les chaînes de propagation de retenue que l’on peut trouver maintenant sur quelques FPGA)12.
On peut distinguer deux types de granularité : la granularité de traitement, la granularité de la communication.
Granularité de traitement[modifier | modifier le code]
Les architectures reconfigurables considèrent généralement deux types de granularités : grain fin et gros grain. Le premier correspond à des ressources logiques souvent de type LUT (Look Up Table). Les LUT sont de petite mémoire que l’on retrouve dans le FPGA. Elles sont capables de réaliser n’importe quelle fonction booléenne simple sur ses entrées. Le deuxième concerne plutôt des architectures construites autour des matrices d’ALU, voir des cœurs de processeurs élémentaires. D’autres architectures gros grain sont composées d’opérateurs arithmétiques de type additionneur, multiplieur ou MAC. Souvent les architectures reconfigurables sont hétérogènes, c'est-à-dire qu’elles ont des ressources de calcul de granularités différentes. Nous pouvons avoir par exemple dans la même architecture une partie grain fin pour traiter les manipulations binaires et des parties avec une granularité plus importante pour les calculs arithmétiques.
Granularité de la communication[modifier | modifier le code]
Certaines architectures, vu le nombre de connexions, utilisent des réseaux de connexion locaux. Les connexions se font alors point à point. Ce type de réseaux facilite les communications locales en limitant le nombre de connexions possibles au niveau global. La connectivité des modules est assurée par les matrices de connexions configurables. Ces dernières diminuent les performances pour des communications éloignées (en fréquence de fonctionnement et consommation de puissance) et nécessitent des outils de placement routage efficaces. Dans les technologies actuelles, les délais des commutations sont bien inférieurs à ceux de la propagation des signaux le long des fils. Les connexions longues distances sont donc lentes et consommatrices d’énergie13.
HoMade est un processeur que vous allez vous fabriquer sur mesure. Il ne fera rien sans que vous ne lui en donnez les moyens par l'ajout statique ou dynamique d'IP interfacés à la pile de l'Homade.
Les FPGA permettent de concevoir des "accélérateurs matériels": un circuit dédié, instancié sur le FPGA qui utilise au mieux les ressources matérielles offertes. Certains softcores ( un cœur de processeur instanciable sur FPGA comme HoMade) proposent des facilitées pour connecter ces IPs " Intellectual Properties" associées à des spécialisations du langage machine et donc du softcore. HoMade sur cette idée va plus loin en généralisant la notion d'IP: tout calcul est réalisé par un IP ou accélérateur matériel. HoMade est un cœur d'intégration d'IPs. Sans IP il ne peut rien faire!
Certaines familles de FPGA supportent une fonctionnalité de reconfiguration dynamique partielle qui ouvre de nouvelles possibilités dans la mise en place de systèmes matériels. En effet lors de l'exécution, et non plus lors de la conception, on peut alors associer des zones de silicium temporairement dédiées à une partie du traitement de l’applicatif. C’est la porte ouverte à la conception de softcores dynamiques s’adaptant à l’exécution de l’application. En appliquant ce principe systématiquement, HoMade est un processeur que vous allez vous fabriquer sur mesure. Il ne fera rien sans que vous ne lui en donner les moyens par l'ajout statique ou dynamique d'IPs spécialisés et interfacés au cœur d’exécution HoMade. Les IPs se chargent du traitement des données, le cœur HoMade quant à lui se chargent du contrôle du flot d’exécution.
La technologie FPGA 3D ouvre aussi la voie aux architectures massivement parallèles, par le grand nombre de cellules programmables disponibles sur la puce. Par exemple, Xilinx a instancié 3600 processeurs 8-bit PicoBlaze s’exécutant simultanément sur le Virtex-7 2000T. Il devient alors possible de créer des machines massivement parallèles basées sur des IP. En y ajoutant la Reconfiguration Dynamique Partielle, de telles architectures peuvent alors être spécialisées à l'exécution en utilisant par la suite une reconfiguration parallèle soit pour tous soit pour un sous-ensemble d’IPs. La reconfiguration dynamique partielle rejoint le parallélisme grâce au processeur HoMade.
Un cœur HoMade : une mémoire d'instruction, l'unité de contrôle, la stack et plusieurs IPs
De la simplicité naît la multiplicité ! Un cœur HoMade simple pour instancier un grand nombre de processeurs sur le FPGA.
HoMade peut être vu comme un intégrateur d’IP. Ainsi une configuration particulière d’HoMade pour une application pourra instancier et donc intégrer dans son architecture les IPs adaptés à son application. En poussant à l’extrême ce principe de spécialisation, HoMade ne propose aucune unité de calcul ou de mémorisation prédéfinies. Le jeu d’instruction en devient alors ultra réduit car dédié presque exclusivement aux instructions de contrôle flot. Avant toute génération sur FPGA il sera nécessaire d’ajouter vos IPs au risque de ne pas faire grand-chose avec votre processeur ;-)
Comment programmer un processeur sans instruction de calcul, de registre ou de load/store ? En fait une et une seule instruction permet de déclencher un IP particulier parmi 2047 instanciations possibles. Si pour une application particulière nécessite quelques registres de travail, un IP devra le proposer. Si une application demande une mémoire de travail, un IP devra le proposer (en fonction du FPGA et de la carte sans doute). Si une application nécessite une ALU , un IP devra l’implémenter etc…
Le processeur propose donc 12 instructions dans un format unique de 16 bits. On peut regrouper les instructions par famille :
· Les 4 instructions de saut : branchement absolu, branchement relatif et 2 branchements relatifs conditionnés. La condition est évaluée depuis le sommet de la pile en fonction de la valeur nulle ou pas. Avec ces quatre instructions, les compilateurs sont capables de générer le code de toutes les structures de contrôle des langages de programmations, au moins ceux du langage HiHope développé dans notre équipe comme une extension de Forth.
· Les 2 instructions d’appel de fonction : le Call et return fonctionne avec les adresses absolues des instructions du programme en mémoire.
· L’instruction de fin d’exécution : elle arrête le processeur dans l’état actuel et signale cette fin d'activité sur une des broches de sortie du processeur.
· Les 2 instructions maître/esclaves : L’une permet de déclencher un code exécutable rangé dans toutes les mémoires d’instructions des esclaves (la même adresse de début de programme pour tous est la seule contrainte). La seconde attend que tous les esclaves valident leur fin d’activité.
· L’instruction IP : elle permet de déclencher un IP parmi les 2047 possible. Elle précise également les actions à entreprendre sur la pile (Push/Pop) lors de l’exécution de cet IP. Les IP sont classés en deux groupe short ou long suivant le temps d’exécution égal ou supérieur à un cycle processeur.
· L’instruction de réflexivité : Cette instruction est la seule qui puisse écrire dans la mémoire d’instruction avec des contraintes strictes sur les adresses d’écriture. Elle permet de changer lors de l’exécution le programme en cours d’exécution lui-même. Elle sera utile pour la reconfiguration dynamique « logicielle/matérielle » permettant par exemple de remplacer un appel de fonction par un déclenchement d’IP.
· La douzième instruction LIT permet de manipuler des valeurs immédiates de 12 bits en le rangeant sur le sommet de pile.
HoMade propose un jeu d'instruction Hyper réduit à 12 instructions. Toutes les instructions sont codées sur des mots de 16 bits. Pour certaine instructions, il faudra 2 voire 3 mots de 16 bits de plus pour ranger poids forts et poids faibles à la suite de l’instruction(codage Big Endian) ou instructions de reconfiguration. On parlera d’instructions étendues
Pour le rangement en mémoire, on utilise des mots de 64 bits en big endian également. La première instruction sur les bits de poids forts, puis la seconde etc… On obtient donc 4 mots de 16 bits à chaque lecture mémoire d’instruction. Un mot de 64 bits représente pour le compteur ordinal 4 adresses alors qu'il ne représente qu'un seule adresse pour la mémoire d’instruction.
Les instructions étendues sont nécessairement rangée dans un seul mot mémoire de 64 bits. Voici un exemple avec l 'instruction CALL.
Cette instruction unique permet de déclencher jusque 2048 (-1 que l’on verra plus tard) IPs différents. Elle permet d’identifier le nombre de données dépilées de la pile du processeur lors de l'exécution, le nombre de données empilées sur la pile en fin de cycle d‘exécution, et enfin le numéro de l’IP à déclencher.
Son format et donc le suivant, il est sur 16 bits :
•XX : POP 0, 1, 2 ou 3 valeurs retirées du sommet de la pile. Ces trois valeurs sont exploitables par l’IP déclenché.
•YY : PUSH 0, 1, 2 ou 3 valeurs produites par l’IP peuvent être rangées sur la pile
•S : 0 indique un IP qui s’exécute en moins d’un cycle : Short_IP. 1 signifie que l’IP s’exécute sur plus de 1 cycle : Long_IP. Dans le cas d'un Long_IP, l'activation du signal IPdone est nécessairement déclenché par cet IP pour signaler la fin d’exécution. Des codes VHDL sont donnés en exemple dans la partie bibliothèque d'IPs/ Construction d'IP pour chacune de ces valeurs.
•IIIIIIIIII : sur 10 bits, le numéro de l’Ip à déclencher. On a donc 1024 IP en un cycle et 1023 IP en plus de un cycle.
‘1_10_01_0_0000000001’ déclenche l’IP 0_0000000001 et dépile les deux sommets de pile pour empiler un résultat en moins d’un cycle.
‘1_00_01_0_0000000001’ déclenche le même IP 0_0000000001 sans dépiler les deux sommets de pile et empile le même résultats que précédemment en moins d’un cycle.
‘1_00_01_1_0000000001’ déclenche l’IP 1_0000000001 sans rien dépiler et empile un résultat après un certain nombre de cycles non connu à l’avance et supérieur ou égal à 2 cycles.
L’IP de numéro 1_1111111111 n’est pas autorisé. Il est réservé pour la gestion interne des déclenchements d’IP.
L’IP ‘1_11_11_1_1111111111’ est appelé NULL. Il est utilisé lors de l’assemblage des instructions par mots de 64 bits afin de remplir les bits de poids faibles du mot lorsqu’il faut aligner l’instruction suivante sur les poids forts du mot de 64 bit suivant. Son exécution n’existe pas et donc aucun cycle n’est nécessaire lorsque cette instruction est chargée par le contrôleur de la mémoire de programme. Le programme suivant est composé de 4 instructions, la troisième étant une instruction étendue. On ne peut pas trouver 4 instructions NULL dans le même mot de 64 bits!!
Il existe trois instructions de branchement relatif : BR, BZ et BNZ. Elles fonctionnent toutes les trois sur le même schéma, 6 bits pour le code opération et 10 bits pour le déplacement.
Ce déplacement est un entier en complément à deux qui s’ajoute à la valeur du compteur ordinal pointant sur cette instruction de branchement. La valeur de déplacement ZERO est interdite et entraînerai une boucle infinie. Les deux instructions BZ et BNZ ne consomment plus le sommet de pile depuis la version V5. Elles effectuent le branchement sous condition de la valeur présente sur le sommet de pile 2 cycles plus tôt. Cette notion de branchement retardée par anticipation permet de placer une instruction entre celle qui produit le prédicat et le branchement relatif lui-même. En particulier il est possible de placer une instruction qui depile le sommet si besoin. Les instructions de branchement sont toutefois à éviter ;-)
Dans tous les cas le résultat du branchement doit pointer vers une instruction effective ( pas un NULL!!!)
Il y a deux instructions étendues sur trois mots de 16 bits. Elles produisent toutes les deux le même effet sur le compteur ordinal en y rangeant la valeur codées sur les deux mots de 16 bits suivants (codage Big Endian). Le CALL mémorise en plus l’adresse de l’instruction afin de pouvoir revenir à l’instruction suivante lors de l’instruction RETURN. Par le stockage sur 64 bit en mémoire de programme , le temps d'exécution de ces deux instruction reste en un seul cycle. La pile de stockage de l'adresse de retour est dédiée et de taille fixée lors de la synthèse de HoMade. (16 par défaut)
Le résultat du branchement doit pointer vers une instruction effective ( pas un NULL!!!)
Voici les codages de ces deux instructions :
Il existe deux instructions de contrôle de flot. La première RETURN permet le retour d'appel de procédure par restauration du compteur ordinal de la valeur rangée lors de l'appel de fonction CALL.
La seconde HaLT permet d’arrêter le processeur dans l'état courant . Dans un HoMade Slave, cette instruction déclenche l’activation de la sortie ORTREE sur le processeur. L'esclave ne redémarrera dans l'état actuel que lorsque le signal StartCPU est activé et avec l'adresse construite à partir des 13 bits positionnés sur StartAdress (cf Instruction SPMD). Le redémarrage du processeur maître ne peut se faire que par un rechargement du bitstream ou un rechargement des fichiers de code binaire HoMade.
Ce fonctionnement permettrait même une arborescence d'Homades. Un processeur homade est un esclave de son père et le maître de ses fils. Une telle utilisation demande un modèle programmation assez particulier qu'on pourrait appelé dériver du SPMD.
Il existe une instruction qui explicitement range un nombre en sommet de pile du processeur. Cette instruction LIT permet de manipuler des nombres binaires non signés sur 12 bits.
Plusieurs LIT de suite avec des décalages et logiques permettent de construire des mots de plus de 12 bits ( CF bibliothèque d'IPs)
Une nouvelle instruction apparaît à partir de la version 2.2. La réflexivité comme concept matériel du processeur HoMade: cette nouvelle instruction est dédiée à la modification de la mémoire de programme. Il est sans doute nécessaire de rappeler que le processeur HoMade fonctionne plutôt suivant une architecture Harvard avec séparation de la mémoire d'instructions et de la mémoire de données. Cette mémoire de données n'existe que si un IP mémoire a été instancié dans la configuration du processeur.
L'instruction WIM va permettre d'écrire dans une mémoire de programme (du maître ou des esclaves) une suite de trois instructions alignées sur un mot de 64 bits de la mémoire. L’instruction WIM doit nécessairement être alignée sur un début de mot en mémoire. Seules les adresses 1&00 à 111111111111&00 sont accessibles par cette intercession. Le champ WIM précise explicitement cette adresse (ou du moins les 12 bits de poids forts de cette adresse). La quatrième instruction du mot de 64 bits n'est pas modifié par le WIM, il convient de l'initialiser soit à RETURN soit à HLT suivant l'usage local au processeur ou SPMD. Dans la mémoire; il faut mieux réserver les emplacements nécessaires pour l'intercession du programme en cours.En aucun cas cette zone de mémoire d'instructions ne pourra être swappée en mémoire secondaire si une implémentation de cache d'instruction devient nécessaire.
Cette instruction machine sera exploitée principalement pour introduire la notion de VIRTUAL_COMPONENT et PARALLEL_COMPONENT au niveau assembleur.
Utilisation avec ses trois arguments sur 48 bits:
Cette instruction modifiera le code à l'adresse IIIIIIIIIIII&00 et y rangera le mot de 64 bits "CODE1_CODE2_CODE3_xxxx". (xxxx ne sont pas modifiés)
Un exemple d’utilisation: la reconfiguration dynamique hard/soft:
WIM CALL AAAA BBBB permettra de construire une indirection dynamique vers un appel de fonction en rangeant CALL AAAA BBBB RETURN sur un mot de 64 bits initialisé à xxxx xxxx xxxx RETURN
WIM IPCODE RETURN NULL permet de changer cet appel de fonction en déclenchement d'IP en rangeant IPCODE RETURN NULL RETURN sur ce même mots mémoire.
On peut aussi produire une fonction "online" dynamiquement:
WIM ADD ROT DUP rangera le code ADD ROT DUP dans la mémoire d'instruction.
Deux autres instructions SPMD et WAIT permettent de déclencher en parallèle et de se synchroniser en fin d'exécution une batterie d'Homades esclaves. L'instruction SPMD fournit une adresse de branchement sur 13 bits [ I12 .. I0 ]à tous les Homades esclaves qui la recevront. Cette adresse est alors décalée de 2 sur la gauche ( Multiplié par 4). Cette adresse mémoire doit contenir le programme à exécuter par tous les Homades esclaves. Ce programme devrait être de longueur inférieure ou égale à 4 afin de n'utiliser qu'un seule entrée dans l'espace d'adresse, cela peut être un CALL. Il doit nécessairement se terminer par l'instruction HLT. Ici le WIM pourra modifier ce code sans changer le HLT final.
SPMD;
WAIT:
On pourra par exemple placer un CALL sur 3 mots suivi d'un HLT pour obtenir un mode de fonctionnement SPMD. On pourra aussi placer 1 instruction suivi d'un HLT pour émuler un mode SIMD ( 4 cycles au moins sont nécessaires : SPMD + Instr_SIMD + HLT + WAIT ) .
Un mécanisme de gestion de l’activité permet de sélectionner un sous ensemble d'esclaves participant à la fonction SPMD. Une bascule d’activité est positionnable soit depuis un IP du maître soit depuis un IP de l'esclave. (dans ce cas on ne peut que le rendre inactif). ces IPs sont proposés dans la bibliothèque HoMade de base.
La gestion des communications entre esclaves et avec le maître dépendent de la topologie du réseau et sont là encore réalisées par de IPs dédiés. La bibliothèque HoMade propose une solution générique pour une grille 2D Torique. Des exemples sont disponibles dans la partie étude de cas pour mettre en place le modèle de calcul SPMD avec gestion de l'activité des esclaves et avec différents réseaux de communication.
Homade est conçu pour supporter la configuration dynamique
Logiciel/logiciel
Logiciel/matériel
Matériel/matériel
Afin de mettre en œuvre ces fonctionnalités dans le processeur Homade il existe une instruction WIM qui propose de modifier par exécution le contenu même du programme. cette modification est contrôlée par le processeur Homade et non sauvage via une écriture en mémoire. cela est possible par la construction du modèle suivant une architecture Harvard.
Homade ne fait rien seul, il n'y a ni ALU, ni registre, ni mémoire de données, ni...
Avant d'écrire et exécuter un programme , il faut ajouter vos propres IP, ou les IPs de nous proposons par défaut dans la bibliothèque.
Exercice
Exercice 1 : Codage en HoMade
1) Ecrire une fonction en Hexa avec commentaires qui empile les valeurs 4,3,2,1,0 sur la pile. Donnez un programme Hexa qui appelle cette fonction et commence à l’adresse 0.
Exercice 2 : post fixé en HoMade
1) Transformez les expressions suivantes en notation postfixée et préfixée.
T = A + B * ( C+ D ) – E *F
2) A, B … F étant les valeurs hexa codées sur 4 bits, donnez le code binaire HoMade qui produit le résultat sur la pile avec comme codes pour x20 pour l’IP +, x21 pour l’IP – (sous sommet – sommet), x14 pour *. La multiplication demande plus d’un cycle.
3) Même question pour cette expression ( A + B ) * ( A – B ) . On pourra utiliser x0D pour l’IP Rotation qui fait tourner les 3 sommets de pile a b c => c a b ..
Exercice 3 Calcul sur la pile
On ajoute un IP DEC qui décrémente le sommet de la pile. Il est associé au numéro d’IP x23 et fonctionne en moins d’un cycle. On ajoute un IP swap qui permute les deux sommets de pile, il est associé au code x09, lui aussi en moins d’un cycle
a. Donnez tous les codes intéressants en hexa (sur 16 bits) qui déclencheront cet IP DEC avec des effets différents sur la pile, expliquez ces effets.
b. Ecrire en Hexa une fonction qui remplace la valeur de sommet de pile N, par la suite N, N-1, N-2, … 1 , 0
c. Ecrire le programme qui utilise cette fonction pour la suite 10, 9, 8, … 0