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.
IP parallèle en bibliothèques
Toujours dans la philosophie de HoMade, il s'agit ici d'une implantation particulière que je propose afin d'exploiter le calcul parallèle offert par les deux instructions de base SPMD et WAIT. Dans cette construction vous pouvez construire une grille torique de [ X, Y ] esclaves en précisant ces paramètres dans le code Hmaster.vhd . Chaque esclave possède un bit d'activité, si ce bit est actif les instructions SPMD sont prises en compte par cet esclave, je ne pense pas que nous aurons le temps de manipuler cette activité dans le cadre de ces TPs.
En ce qui concerne le réseau de communication, il s'agit d'une implantation de grille 2D torique de registres 32 bits nommé buffer de communication. Ces registres sont reliés un à un à chaque esclave, chaque esclave peut alors lire ou écrire dans ce registre par un IP. Iils sont également reliés entre eux afin de construire la grille. Les communications se font alors par un décalage des contenus de ces registres par des IPs du maître .de façon synchrone dans une direction particulière.sur la grille et quelque soit l'activité des esclaves. Le processeur maître est également relié au registre de l'esclave [ 0 , 0 ] et peut y lire ou y écrire une valeur.
La liste des IPs est dispo sur le site.
HoMade propose 2 instructions machine pour la programmation parallèle. Ellen fonctionnent sur le principe du SPMD. Chaque esclave possède sa propre unité de contrôle avec sa propre mémoire de programme. Le maître déclenche des calculs sur les esclave en spécifiant une adresse de démarrage , un peu comme un call. Lorsque un esclave a terminé son programme, il finit nécessairement son traitement par un halt. Le maître peut alors attendre que tous les esclaves soient bloqués sur un halt pour poursuivre son exécution. Il peut aussi à ses risques lancer une autre commande SPMD quand il le souhaite sans un wait. Cette séparation entre déclenchement et barrière de synchronisation est propice au recouvrement des calculs des esclaves par celui du maître.
La déclaration d'in adresse d'un programme parallèle se fait par le mot clef PC dans la partie déclarative des esclaves. C'est la même syntaxe qu'un VC on peut le déclarer , lui affecter statiquement une suite d'au plus 3 instructions ou dynamiquement par une exécution sur l'esclave concerné.
A la différence d'un VC l'appel d'un PC se fait sur le Maître seulement.
Il existe une liste d'IPs prédéfinis pour les esclaves et pour la gestion des communications sur une topologie de grille 2D. La gestion de l'activité de chacun des esclaves est aussi programmable par le maître ou par l'esclave concerné à partir d'une liste d'IP proposés.
exemple
slave
PC send := put // placer le sommet de pile locale sur le réseau de communication déclaration statique
PC receive := get
PC myxy
: xy
xnum $8 -> ynum +
;
myxy := xy // code spmd qui calcule un numero unique pour chaque esclave en fonction de sa position dans la grille et le place sur la pile locale..
.....
master
start
myxy // déclenchement SPMD
wait // barrière de synchro
send // SPMD
....
Après ces deux premières utilisations de HoMade monoprocesseur [1, 0x0], vous allez développer un multicœur avec 1 maître et 2 esclaves [1, 2]. On doit pouvoir en mettre plus sur la carte Basys3, une instanciation de [1, 12x12] HoMade a été réalisée sur la carte xilinx à base de Virtex7 .
Le but de cette séance est de manipuler les possibilités de calcul en mode SPMD. Il existe 2 instructions du langage machine dédiées à ce type de calcul:
SPMD déclenche un calcul sur tous les esclaves actifs, chaque esclaves dispose de sa propre bascule d’activité qui le positionne dans l'état actif ou inactif. Cette bascule est
Cette instruction SPMD déclenche un calcul sur les esclaves actifs en spécifiant l'adresse de démarrage du code présent en mémoire d’instructions des esclaves. L'adresse est alignée sur des mots de 4 instructions, dans l’instruction SPMD on ne spécifie que l'adresse du code sans les deux bits de poids fables qui seront rajoutés automatiquement par HoMade lors de l'exécution de SPMD, il s'agit toujours des deux bits "00".
Exemple SPMD "000_1111_1111" conduit à un branchement sur 2FC = "0_0011_1111_1100".
L'espace d'adressage des fonctions SPMD est donc de 32K mots, soit 8K accès différents possibles. Bien que l'on puisse faire ce qu'on veut de cette mémoire, la gestion de cet espace mémoire doit aussi être partagée avec les instructions WIM qui autorisent les écritures dans cette mémoire d'instruction sur les 16K premiers mots soit 4K emplacement alignés différents. Le compilateur doit mettre en place une gestion de la mémoire de la sorte.
Comme c'est le compilateur qui gère, vous n'aurez pas a manipuler ces adresses vous-même.
WAIT suspend le traitement du maître tant que tous les esclaves actifs ne sont pas en fin d'exécution sur une instruction HALT.
Vous allez par simulation puis par exécution sur la carte observer le comportement d'un programme hmd.
J'ai réalisé pour vous la construction d'un nouveau .bit avec 2 esclaves. J'ai changé dans Hmaster.vhd les valeurs NX_SLAVE et NY_SLAVE.
----- salve
constant NX_SLAVE : integer := 2;
constant NY_SLAVE : integer := 1;
J'ai nettoyé les IPs inutiles pour ce TP en utilisant le fichier IPcode.
Dans le menu Project>Design Goals and Strategies sur le menu déroulant Design Goal j'ai mis l'option Area Reduction . Les autres options n'arrivent pas toujours à mapper 3 HoMades!!!
J'ai aussi changé l'IP mul16 en ouvrant IPcore. Il utilisait des LUT et on va maintenant utiliser un DSP qui existe sur le chip de la carte....autant garder les LUT pour les autres HoMade. Voici l'utilisation de la surface pour ces trois cœurs HoMade , on doit pouvoir encore en mettre.....
Vous pouvez trouver cette nouvelle configuration dans le zip en bas de page. La synthèse dure un peu plus longtemps qu'en mono processeur et il faut mieux simuler avant de tester sur la carte. La configuration devrait s'adapter à la version for next du calcul de PI.
Voici le code que vous allez placer dans Master_tb.vhd pour comprendre le calcul parallèle par simulation. Ce code aurait pu être 'presque' produit par notre assembleur Hasm. ( les interruptions insèrent des lignes de VC en début de code...)
constant rom : rom_array := (
-- Master code
x"0c00_0000_001c_ffff", -- 0
x"a002_8000_8000_1400", -- 4
x"2010_a013_81f8_81f9", -- 8
x"4001_6000_4002_6000", -- c
x"8812_81fa_ffff_ffff", -- 10
x"1000_0000_0004_8812", -- 14
x"1000_0000_0004_1400", -- 18
x"1000_0000_0008_1c00", -- 1c
x"ffff_ffff_ffff_ffff", -- 20
-- Slave code
x"1000_0000_000c_1c00", -- 0
x"8a00_1c00_8000_1c00", -- 4
x"8a02_c820_a201_1c00", -- 8
x"1400_ffff_ffff_ffff", -- c
x"ffff_ffff_ffff_ffff" -- 10
);
Lancer la simulation et normalement vous devriez voir les trois processeur dans le chronogramme.
Voici ce que vous devriez observer:
En utilisant le code TP7.hmd disponible en bas de page, lancez une exécution sur la nouvelle configuration du processeur HoMade. En éditant ce code hexa, vous verrez que j'ai remplacé les deux instructions 8000 8000 par 201F A402, expliquez la différence et l’intérêt d'un tel changement?
En utilisant Hasm écrire un programme assembleur HoMade qui fait la même chose , vérifiez si le code est le même que celui que je vous fourni c'est pas certain du tout!!! Vérifiez sur la carte le comportement et faire valider ...
Vous allez maintenant écrire un programme qui calcule Pi en utilisant la même méthode que celle du TP7 mais en utilisant les deux esclaves en parallèle afin de partager le travail. Pour cela il faut instancier votre IP_rdm dans les esclaves. C'est assez simple il vous suffit de déclarer cet IP dans Hslave.vhd et de l'instancier dans la suite du code. Il faut juste modifier le paramètre du generic en remplaçant le M par un S dans genM_rdm. Vous pouvez vérifier que cette constante est bien initialisée à '1' dans IPcode.vhd.. Je vous rappelle les deux codes résultats:
COMPONENT IP_Rdm
GENERIC (Mycode : std_logic_vector (10 downto 0));
PORT(
clk : IN std_logic;
reset : IN std_logic;
IPcode : IN std_logic_vector(10 downto 0);
Tout : OUT std_logic_vector(31 downto 0)
);
END COMPONENT;
Mrdm : if genS_rdm = '1' generate
Inst_IP_Rdm: IP_Rdm
generic map (Mycode =>IPRdm)
PORT MAP(
clk => clock,
reset => reset,
IPcode => Icode,
Tout => Tbusst
);
end generate Mrdm;
Pour obtenir le même résultat qu'en monoHoMade il faut calculer exactement les mêmes points aléatoires. Il faut donc répartir les nombres aléatoires sur les deux esclaves sans recouvrement; Je vous propose de traiter les éléments de la suite random 1,3, 5, 7 ... sur l’esclave [0,0] et les 2, 4, 6, 8, ... sur le second esclave [1,0]: pour un tirage de 10000 nombres on ne procédera sur un esclave qu"à 8000 calculs effectifs, il faut faire deux tirages à chaque itération et il suffit d'en traiter un sur deux mais dans le bon ordre. Après récupération des résultats sur les esclaves par le maître ( a priori si vous êtes arrivé là, vous savez comment faire ;-) ) il suffit de faire la somme des deux résultats partiels pour obtenir le résultat final. Attention si vous placez du code exécuté lors de l’initialisation des esclaves, assurez-vous qu'il soit fini avant de lancer une commande SPMD!!!
A vos assembleurs!!
Voici ce que j'observe jusqu'au premier tirage aléatoire. Çà peut vous aider et vous devriez observer quelque chose de semblable si vous placer votre binaire dans Master_tb.vhd pour la simulation. Vous pouvez observer dans ce chronogramme la désynchronisation des deux esclaves qui ne font pas exactement la même chose au démarrage!!!
Une fois le résultat obtenu et comparé avec le programme du TP8, calculez le nombre de TIC de cette version parallèle et comparez-le avec le nombre de TIC de la version monoHoMade du TP8, évitez bien entendu les I/O. Quel est les speed-up de votre code parallèle?
Au lieu d'appeler coup sur coup l'IP_rdm afin de sauter un élément sur deux, on a un cycle de perdu qui ne produit rien voire 2 si vous faites un drop ensuite; modifiez le code de cet IP afin de produire directement le nombre aléatoire rdm(i+2). Il suffit de changer la formule du LFSR en anticipant.le calcul...
Simuler le comportement de cet IP.
En fin il faut pouvoir démarrer avec la bonne valeur initiale en fonction de l'esclave sur lequel on se trouve. Je vous propose d'utiliser deux codes IP successifs reconnu par le seul IP_rdm. le premier permet d'initialiser la suite aléatoire depuis le sommet de pile et le second de produire l’élément rdm(i+2).
Modifiez votre code fsh et testez sur la carte....
Et sur 4 esclaves......