à jour successives. Par exemple, la structure précédente serait capable de mettre à jour 16 couches de 16 neurones dans le temps de mise à jour d'une couche avec un circuit, ce qui est intéressant pour les applications où les réseaux sont compétitifs, par exemple,

* L'utilisation d'un microséquenceur placé sur le BUS de contrôle permet de gagner en vitesse sur les temps de FETCH (négligés ici), et sur les instructions sans échange de données dont on peut diminuer le temps de cycle (indépendamment de la libération de l'hôte qu'elle autorise dans le cas de boucles répétées d'appels aux circuits, utile dans le cas de réseaux compétitifs comme précédemment, par exemple). Dans l'hypothèse (favorable, mais d'intérêt pratique limité à accroître l'indice de performances en NIPS) de microséquenceurs capables de seuiller et mettre à jour les états de neurones, ainsi que d'effectuer des mises à jour sur plusieurs circuits (problème de sémaphores pour contrôler le BUS des circuits), un groupe de 16 de ces associations circuit/microséquenceur prend $4\mu s$ (16 cycles de contrôle et un cycle de travail) pour mettre à jour une couche de 16 neurones, soit 250000 NIPS,

Une hypothèse plus vraisemblable est de n'implanter qu'un seul auto-
mate de ce type par BUS de contrôle (pas de contention possible), ce
qui donne les mêmes performances que le cas précédent (138800 NIPS),
mais sans l'intervention du Transputer, ce qui est plus plausible si l'on
prend en compte la difficulté de mettre au point le programme de
contrôle des seize circuits échelonnés dans le temps.

4.3.2 Circuits contrôlés par un microprocesseur classique

Une comparaison du Transputer avec des microprocesseurs classiques pour la tâche de contrôler des circuits neuromimétiques est intéressante, en particulier pour juger de l'efficacité de systèmes peu coûteux ajoutés dans une structure existante (carte de développement, micro-ordinateur, station de travail...).

La principale limitation provient du fait que les systèmes d’exploitation
correspondants sont généralement monoprocesseurs, ce qui entraîne une li-
mitation du nombre de circuits contrôlables plus faible que par une structure
parallèle (la mise au point d’un mécanisme de communication entre plusieurs
de ces processeurs, par exemple par partage de mémoire et sémaphores,
est jugée trop lourde); cette limite peut être repoussée par l’adjonction
d'automates séquenceurs.

Si l'on se place dans le cadre de l'étude de l'interfaçage d'un faible nombre de circuits neuromimétiques, la différence principale vient des accès mémoire: ils ne sont pas de longueur variable (c'est le cas par exemple des microprocesseurs Motorola 68000 ou Intel 80386). L'adaptation du circuit au protocole exigé par ces processeurs pour leur mémoire peut demander un peu plus de logique; en revanche, leur temps de cycle stable (et plus faible que celui du Transputer accédant à de la mémoire externe: 150 ns) peut se révéler un atout, permettant de s'approcher du niveau de performance qui nécessite des automates séquenceurs pour un contrôle par Transputer.

### 4.3.3 Circuits controlés par un DSP

Le gain escompté provient ici du faible temps de cycle, et des BUS programme et données séparés, ce qui permet de supprimer le temps de FETCH du Tranpuster.

Cette solution s'avère inintéressante après examen: les DSP ne sont pas prévus pour optimiser les accès aléatoires à la mémoire, mais plutôt pour lire des coefficients dans des tableaux. Ainsi, l'écueil du temps d'accès variable au circuit se pose comme dans le cas du Transputer.

### 4.3.4 Circuits contrôlés par un RISC

Le faible temps de cycle et le grand nombre de registres de ces processeurs laisse augurer d'un potentiel de contrôle propre à satisfaire les exigences de plusieurs circuits. D'autre part, les systèmes et langages sont plus riches que ceux concernant les DSP, plus orientés vers des tâches particulières, lourdes en calculs.

Dans le cas du SPARC (SUN), par exemple, il est tentant d'implanter le composant comme un coprocesseur, ce qui permet d'ajouter au jeu d'instruction initial les appels au circuit. Malheureusement, la stucture de coprocesseur d'un SPARC est prévue de manière à ne comporter que 32 registres, ce qui ne permet pas de représenter l'espace d'adresse du circuit.

D'autre part, les échanges entre le CPU et la mémoire ne sont rapides que par l'utilisation du cache et du pipeline interne, ce qui ramène les performances envisageables au niveau de celle d'un contrôle par un microprocesseur classique dans le cas d'une interface des circuits comme mémoire du SPARC.
## 4.3.5 Architectures dédiées

Le cas des systèmes dédiés varie fortement d'un exemple à l'autre. Le principe commun à tous est d'obtenir un taux d'activité de chaque circuit proche de la saturation. Dans ce cas, les performances en NIPS ne correspondent pas nécessairement à une représentation adéquate de l'activité, la structure étant optimisée pour un réseau qui n'est pas une couche de 16 neurones. Si un nombre suffisant de Transputers et d'automates séquenceurs est employé par rapport au nombre de circuits que comporte le système, il est possible d'atteindre par circuit les niveaux de performances indiqués dans le paragraphe 4.3.1 (après remplissage du pipeline représenté par les circuits successifs, dans le cas de réseaux en couches, par exemple).
Bibliographie

[Mil 87] D. K. Milligan and K. N. Gurney 1987 *RAM-unit Learning Networks*, Actes Conf. I.C.N.N. San Diego, Vol. 2, pp 557-565

[Oua 90] J. Ouali, G. Saucier 1990 *Fast Generation of Neuro-ASICs*, Actes Conf. I.C.N.N. Paris, Vol. 2, pp 563-567
# Chapitre 5

## Résultats obtenus
## 5.1 Le circuit

### 5.1.1 Détails concernant la phase de conception

Le circuit prototype est réalisé en technologie CMOS 1.5µ, et comporte de l'ordre de 120000 transistors, pour environ 9000 cellules précaractérisées. La technologie 1µ désormais disponible représente un gain d'un facteur 2 environ en surface, et 40% en vitesse. Cela rend envisageable un circuit présentant un facteur de parallélisme deux fois plus grand basé sur la même architecture, soit 32 neurones, tout en facilitant l'ajustement du séquencement interne, même si l'on destine le composant aux futurs Transputers fonctionnant à 30 MHz.

L'objectif de 16 neurones par circuit en technologie 1.5µ, sans sacrifier l'implémentation de quelques fonctionnalités, dont les essais détermineront l'intérêt d'un éventuel développement dans les versions futures (décodeur, automates, reconfigurabilité...), et tout en se pliant au séquencement des Transputers à 20 MHz, a demandé de s'approcher des limites de la technologie. La surface du circuit est importante, sa taille étant d'environ 12 mm par 12 mm; les simulations électriques ont dû être conduites sur une base proche du meilleur cas en raison de la vitesse attendue de l'ensemble, ce qui a imposé une gestion précise des chemins critiques propres aux différentes parties du circuit (par exemple demandant l'utilisation de cellules de retard pour équilibrer les délais), et un calcul au plus juste des marges de sécurité. Pensant que l'on attendrait d'un circuit d'usage général autant sa rapidité d'exécution que l'efficience de son jeu d'instructions pour la programmation d'une application, cet effort a permis de ne nécessiter l'appel à un allongement du cycle d'un Transputer à 20 MHz que pour une instruction (STEPREAD), tout en autorisant un séquencement des instructions sans nécessiter le temps mort durant lequel le Transputer effectue un FETCH ou un calcul de décalage par rapport au début de l'espace de travail.

Je n'ai pas cherché à minimiser le plus possible la surface du circuit, préferant arrêter la conception dès l'obtention d'un fonctionnement simulé satisfaisant afin de pouvoir consacrer du temps à sa mise en œuvre. Un gain en surface, dans le même cadre de travail, aurait certainement pu être obtenu, par exemple en:

* améliorant les arbres d'amplification électrique des signaux (minimiser la taille et le nombre des buffers tant que les contraintes temporelles sont satisfaites); par exemple, VLSI Technology conseille l'utilisation d'un buffer de taille unitaire pour charger une capacité équivalente à
trois entrées de cellule précaractérisée,

* étudiant de plus près une solution de décodage d'instructions local à chaque bloc contre la circulation de signaux décodés (le premier choix a souvent été retenu en raison des fortes capacités présentes sur les fils d'adresses, qui nécessitait une amplification importante),

* procédant à plus d'essais de placement-routage: le bloc de quatre neurones, qui assure des performances fiables pour le début de la chaîne de traitement, provoque une perte de surface, car les blocs dont il est composé (RAM, chemin de données, cellules précaractérisées) ne s'aboutent pas parfaitement entre eux, et les blocs de quatre neurones ne s'aboutent pas parfaitement non plus avec les blocs de cellules standard; de plus, ceux-ci ne pouvaient pas être traversés par les BUS de manière transparente avec la version utilisée du logiciel de routage,

* en procédant à un calcul de consommation plus précis, les estimations basées sur les indications du fondeur ayant conduit à des rails d'alimentation de $150\mu$ correspondant à une consommation moyenne supérieure à $2W$, alors que les tests ont montré une consommation inférieure à $1/2W$ (seuil de sensibilité du testeur).

Les problèmes principaux durant la phase de conception ont été rencontrés pendant le placement-routage: la prise en compte des capacités de connexion estimées avec précision a entraîné la remise en question de nombreux chemins de contrôle, ainsi que l'allègement de certaines fonctionnalités pour gagner de la surface. Il faut prendre garde au fait que chaque modification des schémas peut entraîner des répercussions sur l'ensemble du circuit, et il faut vérifier le déroulement correct de boucles de simulations de plus en plus complètes le plus rapidement possible. L'aspect non déterministe du logiciel pose des problèmes lors du placement des cellules précaractérisées: un degré de voisinage souhaité peut être demandé (ce qui est essentiel pour un circuit de cette taille, sinon le coût en routage devient prohibitif), mais la prise en compte de cette information rend le placement plus aléatoire; il n'est pas facile de définir les critères de conservation du meilleur compromis obtenu.

La figure 5.1 présente le dessin des masques du circuit prototype: on distingue les quatre blocs de quatre neurones situés dans les coins, occupant deux bandes verticales séparées par les canaux de routage et les deux blocs de cellules précaractérisées. Les blocs de quatre neurones ont subi une rotation pour les placer verticalement, et des symétries permettent de passer
de l'un à l'autre. Dans le bloc situé en haut à gauche, la mémoire est placée en haut (Ram); le chemin de données en dessous (Datapath), ménageant un décrochement où sont placées les cellules précaractérisées réalisant le Registre d'Etat de Neurones (Cells). Les ressources communes (décodage, automates, ALU finale...) sont dans les deux gros blocs de cellules au centre du circuit.

<figure><img src="image_35.png" /><figcaption>Figure 5.1: Masques de LNEURO 1.0</figcaption></figure>
### 5.1.2 Test de 15 prototypes à vitesse nominale

Les 15 premiers prototypes disponibles ont été testés à l'aide du LV500 Tektronix. Ce testeur d'ASIC permet d'une précision du positionnement des fronts de 2 ns et de fréquence maximale 50 MHz. La facilité de mise en œuvre de ce matériel à permis en quelques jours d'avoir une idée assez précise du bon fonctionnement à pleine vitesse du jeu de composants disponibles: les contraintes d'utilisation de ce testeur sont proches de celles rencontrées pour l'établissement du jeu de vecteurs de test destiné au fondeur, qui ne propose que les composants ayant passé avec succès une vérification de type fonctionnel (signaux supersynchrones à 1 MHz). Ainsi, les langages employés sont de la même famille, et la traduction de l'un à l'autre est assez directe.

D'autre part, j'avais approfondi les simulations de validation de la conception du circuit, (basées en partie sur le test supersynchrone, mais à vitesse nominale), afin de détecter quelques unes des inévitables erreurs de conception: cela a permis de déterminer des chemins critiques sur lesquels porter plus d'attention lors des mesures électriques des prototypes.

Les tests ont porté uniquement sur le contrôle par le BUS hôte, en raison de la disponibilité du LV500, pour faciliter la mise en œuvre du composant sur les cartes prévues, décrites dans le paragraphe 5.2, par une connaissance plus détaillée de ses limites.

La dispersion entre les circuits est apparue relativement faible: de l'ordre de 2 ns pour l'instruction la plus longue du circuit dont la phase critique dure 62 ns pour une alimentation de 5V (lecture interne des coefficients synaptiques et des états de neurones, calcul de la somme de produits, puis lecture du résultat sur le BUS hôte); cette dispersion est proche du seuil de précision de l'instrument. Cette mesure et d'autres ont montré que les circuits se comportent de manière très proches du modèle de meilleur cas du simulateur Sim de la chaîne de conception (le pire cas étant 100%, le meilleur cas 47%, le cas standard 74% pour les simulations de la chaîne de conception VLSI Technology, la valeur donnant la correspondance la plus fidèle entre les prototypes et les simulations est 54%); cette fidélité correspond à l'utilisation des capacités estimées après routage, bien que le modèle ne tienne pas compte de la répartition de la capacité d'un nœud sur toute la ligne qui le compose, comme c'est le cas désormais. Cela peut permettre d'évaluer le comportement électrique des parties non testées d'après les simulations avec un degré raisonnable de confiance.

Le rendement précis est généralement tenu caché des clients; 38 circuits fonctionnels ont été produits sur les cinq tranches de cinq pouces d'une
cuisson de prototypes. Ce taux de réussite satisfaisant en dépit de la taille du circuit peut être attribué en partie à la surface importante consacrée aux connexions et alimentations, zônes moins denses donc moins sensibles, et à la bonne maîtrise de la chaîne de production, éprouvée de longue date.

## 5.1.3 Erreurs de conception

Des erreurs entâchent malheureusement la conception de ce circuit, dont la cause peut être imputée à différentes phases de son élaboration:

* Des discussions plus approfondies avec les utilisateurs potentiels de l'architecture auraient peut-être permis de choisir avec plus de rigueur la dynamique des différents registres pour les calculs, tant en mode apprentissage qu'en résolution, ainsi que les communications entre ces ressources, ou tout au moins les possibilités de reconfigurabilité: les applications programmées ont une fâcheuse tendance à solliciter le circuit au-delà de ses possibilités, ce qui occasionne des contorsions de programmation nuisibles au rendement.

De plus, les problèmes de conversion de types de données prennent une grande importance dans les communications avec l'hôte, qui sont d'autant plus nombreuses que le circuit répond incomplètement à l'attente de l'utilisateur,

* Une étude plus approfondie du cahier des charges, avec plus de simulations des applications à programmer auraient mis en évidence le besoin d'un signal de débordement pour les additions réalisées de manière sérielle, les états de neurones binaires s'étant avérés d'un intérêt en diminution. Cela aurait nécessité l'ajout de quelques registres pour mémoriser les bits de poids fort des opérandes avant ce type de calcul. Cela peut donner lieu à de fausses alertes de débordement dans le cas de calculs sériels par l'automate d'apprentissage, dans certains cas de configuration des données, comme cela a été signalé plus haut. Cela se produit par exemple lorsque l'on veut enlever un petit incrément à un grand coefficient synaptique: la décomposition de l'opération provoque une séquence où l'on commence par additionner les bits de poids faible de l'incrément avant de retirer la partie correspondante au bit de signe, selon la définition de la représentation des nombres codés en complément à deux.

D'autre part, un mécanisme de traitement local des débordements arithmétiques, en particulier au niveau des poids synaptiques où toute
la dynamique est sollicitée, sans intervention du contrôle (comme par exemple la saturation à la valeur maximale, ou bien la réécriture de la valeur initiale), permettrait sans doute d'alléger la tâche de contrôle pour un coût modeste. Le circuit devait au départ inhiber tous les calculs lors de l'apparition d'un débordement, que ce soit sur un bit ou en série.

* Enfin, des erreurs de schéma (non détectées par les vecteurs de test, ce qui est difficilement pardonnable pour un circuit aussi régulier) complètent ce tableau.

La première provient de l'utilisation d'un amplificateur-inverseur là où une inversion n'était pas nécessaire: cela entraîne l'impossibilité de savoir quelle(s) unité(s) d'apprentissage a effectué un débordement, le jeu de 16 registres d'état alloué à cette fonction étant constamment remis à zéro (sauf pendant l'impulsion de remise à zéro !). Dans le cas d'un calcul série, il est difficile de contourner ce problème autrement qu'en rechargeant la banque de registres à partir de la Mémoire Synaptique, et de recommencer le pas d'apprentissage avec un $\Delta$ plus faible, ou bien de vérifier par l'hôte les opérandes deux à deux pour déterminer où a eu lieu le débordement.

La seconde erreur touche aussi à la gestion des débordements en apprentissage, mais par un heureux hasard permet de rattraper en partie le problème évoqué plus haut concernant les apprentissages avec des états de neurones codés sur plusieurs bits. En effet, à la suite d'une erreur de câblage entre l'unité centralisant les signaux de débordements et les Registres d'Apprentissage, les trois variantes de l'instruction exécutant un pas manuel d'apprentissage (se repporter à l'annexe A.1.1 pour plus de détails) ne se comportent pas comme souhaité au départ, à savoir invalider tout calcul provoquant un débordement et produire un signal d'erreur pour l'hôte. Cela aurait entraîné une interruption des opérations lors d'un calcul série réalisé par plusieurs appels aux instructions portant sur un bit des états de neurones dans les mêmes cas que ceux cités au dessus pour les débordements pendant des calculs série. En fait, l'une de ces trois instructions se comporte comme prévu, une autre invalide le calcul sans produire d'interruption, la troisième valide le calcul sans produire d'interruption. Cette dernière variante permet de conduire les calculs désirés même dans les cas invalidés lors d'une exécution contrôlée par l'automate; il reste néanmoins à l'algorithme d'apprentissage à assurer de manière théorique qu'un débordement n'a
effectivement pas eu lieu, ou tout du moins de se satisfaire d'un coef-
ficient synaptique ayant subitement changé de signe.

La troisième erreur a aussi été détectée pendant les simulations
complémentaires réalisées en attendant le retour des prototypes, mais
s'est avérée ne pas avoir d'incidence au niveau des circuits, sans doute
en raison de l'imprécision du modèle de représentation des capacités
extraites, non réparties. Cette erreur porte sur le signal d'invalidation
d'un pas d'apprentissage en cas de débordement (décidément !), qui
est directement relié aux unités de détection de débordement sans
être inhibé pendant l'impulsion elle même, comme c'est le cas pour
l'ALU finale. Ainsi, selon les simulations électriques, pour certaines
zônes de valeurs des opérandes, un débordement fictif apparaît pendant
l'établissement des sorties après la mémorisation du résultat courant,
ce qui provoque une interruption du signal de mémorisation, celui ci
redevenant actif après établissement des sorties pour mémoriser de
nouveau un résultat. Heureusement, des tests approfondis n'ont pas
mis en évidence ce problème, le "glitch" du signal étant probablement
gommé par la capacité des lignes, ce qui a permis d'éviter de modi-
fier l'interface prévue pour contrer ce problème, solution qui reposait
sur un raccourcissement de la durée des impulsions, en mode bit à bit
comme en mode automatique.

Une dernière maladresse fut mise en évidence lors du câblage de la
première carte: le Transputer possède bien un BUS 32 bits, mais
se comporte plutôt comme s'il accédait à des mots de 8 bits (par
groupes de quatre), et n'utilise donc pas les deux bits de poids faible de
son BUS multiplexé comme des adresses. Ainsi, l'interfaçage du com-
posant avec le Transputer ne peut donc être réalisée par simple con-
nexion de leur BUS moyennant un décodage comme pour un boîtier
mémoire, et il est nécessaire de réaliser un décalage de deux bits pend-
dant l'adressage du circuit, à supprimer pendant la phase d'échange
de données (l'interfaçage du composant avec les processeurs utilisant
leur BUS d'adresse à partie du premier bit est simplifiée, mais pas
l'interfaçage avec le Transputer de ce point de vue là, bien qu'il soit le
processeur de contrôle privilégié pour le début de l'étude).

5.1.4 Mesure de l'activité du circuit

Une mesure de l'activité du circuit est réalisée très simplement sur la carte
PC présentée dans le paragraphe 5.2.1, par le rapport entre le nombre d'accès
au composant (CSG) et le nombre de périodes de 200 ns s'écoulant entre deux points donnés d'un programme de simulation de réseaux de neurones. La durée de mesure est fixée par le décodage de la PROM de configuration des signaux programmables du Transputer: une lecture à cette adresse produit l'impulsion de début, une autre lecture l'impulsion de fin (le Tranputer peut être mis dans un mode où, après le "boot", il va chercher dans une PROM à placer à l'adresse adéquate, entre autre selon quel séquencement il doit effectuer ses accès mémoire). Un fréquencemètre-compteur d'impulsions effectue le rapport entre la fréquence des accès au circuit et l'horloge à 5 MHz du Transputer (période 200 ns) pendant des intervalles prédéterminés, ou bien compte les impulsions entre deux tops programmés. La période de 200 ns représente le temps d'un accès au circuit dans le cas d'un contrôle simple par le BUS hôte uniquement: on peut la considérer comme un FETCH plus un accès à de la mémoire externe, ou bien comme un accès au circuit avec un cycle d'attente. Si l'on voulait être plus strict, il faudrait compter des périodes de référence de 150 ns, qui peuvent être atteintes par des accès au circuit par l'instruction MOVE-BLOCK: cela multiplie par 3/4 l'indice d'activité obtenu directement. Je pense néanmoins qu'une période de référence de 200 ns est plus réaliste comme limite d'utilisation du circuit dans le cadre du contrôle par un Transputer seul.

Ainsi, un programme dont l'indice est de 100% correspond à un accès au circuit toutes les 200 ns, soit la fréquence maximale d'utilisation dans ce cadre. Comme la zône de travail n'est pas déplacée dans le mode de programmation choisi jusqu'à présent (en OCCAM avec des appels simples à l'assembleur), et que d'autre part le pointeur sur le début de cette zône et le circuit neuromimétique se trouvent être aux deux extrémités de l'espace adressable du Transputer pour des raisons de commodité de décodage, les accès au circuit sont effectués avec une indirection par rapport à un index à placer dans la mémoire locale du Transputer. Cela ajoute deux cycles au temps d'accès externe: le temps d'accès minimal au circuit sans utilisation de MOVE-BLOCK est donc de 250 ns, soit un taux de 80%.

## 5.2 Les cartes

Les cartes réalisées jusqu'à présent n'utilisent que le mode de contrôle le plus simple proposé, chaque ordre correspondant à un accès mémoire d'un Transputer.
## 5.2.1 Test fonctionnel: une carte PC

La première carte mettant en œuvre un circuit a été réalisée pour tester de manière facile son comportement dans un environnement de programmation préexistant: elle se comporte comme une TRAM INMOS [Walk 87, Wats 88], et est donc accessible sous le système d'exploitation TDS [INM 88], qui permet de programmer le circuit en OCCAM [INM2 88] ou en assembleur, en bénéficiant d'outils de développement. Les TRAMs sont utilisées comme des modules enfichables sur une carte mère (figure 5.2), qui prend place dans une station de travail SUN ou un IBM PC. Ces modules sont reliés en pipeline par deux des liens bidirectionnels de chaque Transputers, les deux autres étant reconfigurables par un réseau d'interconnexion "crossbar" programmable. Cela donne des unités d'évaluation des Transputers modulaires et de coût raisonnables.

<figure><img src="image_36.png" /><figcaption>Figure 5.2: TRAMs INMOS sur leur carte mère</figcaption></figure>

Etant néophyte, le "wrapping" de la carte et sa mise au point m'ont demandé un mois: l'ambition initiale d'interfaçabilité aisée est convenablement satisfaite.

Le détail de son schéma ne présente pas de particularité spéciale. Il comporte les éléments communs aux TRAM INMOS: un Transputer dont l'horloge de référence provient de la carte mère occupant un connecteur du PC (référencée B008 par INMOS), et dont les liens sont connectés de manière standard; une mémoire statique de 128 koctets pour loger le programme de contrôle du circuit, munie de sa PROM de configuration; la logique de décodage propre au circuit, ainsi que les composants nécessaires au multiplexage du BUS entre la phase d'adressage et la phase d'échange
de données. Les composants nécessaires au fonctionnement du circuit sont
environ une quinzaine de boîtiers standard, en technologie ACT ou F.

La vitesse du Transputer étant modifiable indépendemment de celle de la
carte mère, quelques essais isolés ont été effectués à 22.5 MHz et à 25 MHz,
donnant lieu apparemment à un comportement satisfaisant, mais ces vitesses
d'exécution provoquent quelques erreurs sur des programmes plus impor-
tants, comme celui de la démonstration de compression d'image, qui contient
environ 1300000 instructions.

Ce phénomène, qui s'aggrave avec la vitesse demandée, n'a pas été
complètement élucidé pour le moment; il est possible que cela soit dû en
partie au "wrapping", technique qui ne permet pas de maîtriser les délais
d'interconnexion aussi bien qu'avec des circuits imprimés, ou par l'utilisation
de boîtiers pour la logique d'interfaçage de technologie inadaptée (cet aspect
s'est avéré sensible lors de la mise au point: la carte n'ayant pas été vérifiée à
l'aide d'un testeur spécifique, différents essais ont été effectués en changeant
la technologie de certains boitiers d'interface pour jouer sur le délai des sig-
naux de façon à obtenir un comportement satisfaisant).

Le développement simultané d'un simulateur du circuit a permis de
transférer rapidement sur cette carte une application de compression d'image
(détails dans le paragraphe [Thee 90]), montrée en fonctionnement le 14
février 1990, lors de la conférence IEE ayant eut lieu à Londres.

### 5.2.2 Test d'architecture: une carte Tnode

Afin de tester le composant dans un environnement présentant un certain
caractère de parallélisme, le schéma d'une carte pour Tnode a été établi sur
le principe de la carte PC, et sa réalisation "wrappée" a été confiée à la
société Telmat qui fabrique et commercialise les Tnodes, résultat du projet
européen P1085. Cette carte utilise le composant spécifique développé pour
ajouter à la structure du réseau de Transputers un BUS de contrôle, qui
permet un debogage interactif des programmes, outil précieux de mise au
point des programmes parallèles.

Les cartes Tnode sont modulaires, selon un principe similaire à celui
employé par INMOS pour ses TRAMs. Les cartes destinées au calcul
peuvent contenir 8 modules, chaque module étant composé d'un Trans-
puter associé à de la mémoire, et de son "gate array" assurant la ges-
tion du CONTROL BUS. Un réseau d'interconnexion de type crossbar pro-
grammable assure les communications entre certains liens des différents
Transputers, les liens restant étant connectés de manière régulière. La carte
”wrappée” sur ce modèle possède deux modules, dotés chacun de quatre composants neuromimétiques, compromis choisi entre la capacité mémoire du jeu de composants neuromimétiques associés à un Transputer et son aptitude à gérer efficacement ces circuits pour différentes applications. Une réalisation par circuits imprimés de ces modules pourrait permettre d’en placer quatre par carte mère; un Tnode possède 7 connecteurs sur son fond de panier, aussi cette réalisation permettrait de réunir un nombre respectable de circuits (112) dans une structure de petite taille, reconfigurable et dotée d’un environnement de programmation orienté vers le parallélisme.

Par rapport à la carte PC à un seul composant neuromimétique, cette carte est dotée de la possibilité additionnelle de programmer plusieurs circuits de manière SIMD, qui est implémentée de la manière suivante: en plus des parties de l'espace mémoire du Transputer reservées à chaque circuit par un décodage propre du signal CS, une partie commune est accessible, où seul le signal CSG est actif, ce qui permet de sélectionner plusieurs circuits, par leur numéro logique. De plus, les signaux d'erreur propres à chaque circuit sont mémorisés indépendamment, pouvant être lus et remis à zéro par accès à un registre particulier; ces signaux peuvent aussi être gérés par le CONTROL BUS, produisant au besoin une interruption masquable destinée au système hôte.

Cette carte, de plus grande taille (format triple europe), a posé quelques problèmes de mise au point, qui se traduisent par le disfonctionnement occasionnel des circuits les plus éloignés du Transputer d'un des modules.

La carte a été présentée lors de la conférence INNC Paris de juillet 1990 sur le stand Telmat Informatique, où la démonstration de compression d'image était effectuée par un circuit neuromimétique appartenant à un des deux modules Transputer.

## 5.3 La programmation d'un système de circuits

### 5.3.1 Programmation du circuit en OCCAM sur les cartes de test

Le BUS de contrôle permet d'exécuter toutes les instructions du circuit par des accès en écriture ou en lecture à une adresse appropriée (la liste complète est donnée en annexe A.1.1).

Le Transputer impose un multiplexage des BUS adresses et données. Les adresses provenant du bus Transputer sont mémorisées sur le premier front du signal ALEN (après avoir décodé l'instruction à l'intérieur du circuit:
se reporter à la figure 3.12 pour le détail du séquencement du Transputer). Les données sont écrites sur les premiers fronts des signaux NotMemWr[3:0] (avec quelques exceptions, lorsqu'une écriture retardée est nécessaire, par exemple pour écrire dans la Mémoire Synaptique), et sont lues par le BUS Transputer pendant l'impulsion du signal NotMemRd.

Une librairie OCCAM (se référer à [INM2 88] pour les spécifications du langage) a été constituée des différents appels aux instructions du circuit, pour permettre de remplacer les appels assembleurs du type:

GUY
LDL 337
STNL 0

1

par un appel à une mnémonique plus explicite, permettant le cas échéant de faire un calcul d'adresse (ralentissant l'exécution mais éclaircissant la programmation), du type:

init

Le contrôle par numéro logique se programme de manière similaire; il faut toutefois prendre garde à appeler des instructions effectivement accessibles dans ce mode, c'est à dire correspondant à une écriture mémoire. Les mnémoniques étant simplement traduites lors de la compilation de code OCCAM, aucun message n'avertit que l'emploi d'une instruction est erroné.

De même, lors de l'appel d'instructions portant sur des champs de taille inférieure à 32 bits, il faut veiller à l'écriture par le protocole adéquat du Transputer.

La librairie actuelle ne permet pas de réaliser des initialisations simul-
tanées, toutes les adresses étant choisies pour être exclusives lorsqu'un choix
est possible; cela diminue le nombre d'entrées dans la bibliothèque ou limite
les calculs d'adresse, pour une perte de fonctionnalité minime.

### 5.3.2 Contrôle parallèle de plusieurs circuits

Le principe de contrôle de plusieurs circuits dépend du type d'utilisation que l'on en fait.

<footnote n="1">¹l'adresse 337 contient par exemple l'indirection par rapport au pointeur de l'espace de travail correspondant à l'adresse de l'instruction du circuit appelée, INIT ici, qui fonctionne en écriture</footnote>
Si les circuits contribuent au calcul d'une même couche, chacun réalise des opérations très semblables aux autres: un contrôle simultané par un seul processus paraît indiqué, évitant d'ajouter un protocole de synchronisation suceptible de faire chuter les performances. Le type SIMD de contrôle sera employé chaque fois que c'est possible, la synchronisation de l'avancement des calculs sur les différents circuits étant matérielle ici.

Dans le cas où la collaboration des circuits entre eux est plus lache, comme par exemple lorsque chacun prend en charge une couche d'un réseau multicouche, les circuits peuvent être gérés indépendamment (par exemple, un processus étant dédié au contrôle de chaque composant). Cela procure une programmation plus souple, et peut s'avérer tout aussi efficace qu'une synchronisation manuelle de chaque transfert de donnée: en effet, avec un protocole adéquat de gestion des communications, un pipeline peut être instauré dans le flot de traitement des données, les communications s'effectuant pendant les calculs suivants. Ce principe donne de meilleurs résultats lorsque le processeur de contrôle n'est pas le maillon limitant les performances de l'ensemble: si trop de circuits sont rattachés à un hôte et effectuent des calculs indépendants, l'hôte passera son temps à envoyer des ordres aux uns et aux autres, et les temps de communications seront ajoutés au temps de calcul.

## 5.4 Mise en œuvre d'applications

### 5.4.1 Compression d'image par analyse en composantes principales

La première application significative programmée sur un système à base de circuits neuromimétiques ne réalise pas selon la terminologie usuelle des calculs neuronaux, mais a plutôt été l'occasion de vérifier le bon fonctionnement du premier système obtenu.

Le principe de compression est de décomposer les points de l'espace représenté par des blocs de pixels selon les premiers vecteurs de la base principale correspondant à un sous-ensemble représentatif de l'image. Les blocs ont une taille 4 par 4 (ce qui correspond au degré de parallélisme du circuit prototype), et sont projetés de l'espace origine de dimension 16 vers un espace à 8 dimensions, en ne gardant que les 8 composantes principales. Une quantification peut intervenir ici, les dernières composantes nécessitant un codage à dynamique plus faible que les premières, ce qui accroit le taux de compression; cette phase ne permettant de tirer parti d'aucune fonction-
nalité du composant n'a pas donné lieu à évaluation.

Des images de 320 par 200 pixels sont échantillonnées par 256 blocs régulièrement répartis, qui permettent de déterminer la base de projection (base principale): le mécanisme d'apprentissage du circuit est utilisé ici pour réaliser une somme cohérente de ces vecteurs: le premier vecteur de base en est la normalisation; on réitère le processus avec le jeu de blocs projeté dans l'hyperplan orthogonal à ce vecteur (procédé de Gram-Schmidt). Ce procédé est aussi utilisé pour orthogonaliser les vecteurs de base au fur et à mesure de leur obtention, en raison du bruit de quantification. Une fois la base obtenue, le codage de l'image entière est réalisé, par projection vectorielle des blocs sur la nouvelle base, avec le mécanisme de résolution du composant, le produit scalaire. Le circuit pourrait être utilisé dans cette phase d'orthogonalisation, mais cela implique de nombreux transferts entre le Registre d'Etat de Neurones et la Mémoire Synaptique; cette phase du traitement reste à la charge du Transputer pour cette raison.

Le décodage consiste en un nouveau changement de base, de la base principale vers la base d'origine cette fois; les projections sont effectuées au moyen de produits scalaires avec la matrice transposée de la première, qui est aussi sa matrice inverse, étant orthornormée.

Le taux de compression relativement faible (facteur 2, mais sans quantification vectorielle) permet d'obtenir des images de bonne qualité après codage et décodage, les différences n'étant décelables que sur des détails de faible taille (hautes fréquences), et l'effet de bloc ne se faisant pas trop sentir: comparer pour cela l'image originale (figure 5.3) et l'image décodée après compression (figure 5.4), la figure 5.5 étant obtenue par différence entre ces deux images, puis multipliée par un facteur 16 pour souligner les écarts.

Cette application a été programmée par des appels à une première version de la librairie des fonctions de contrôle du composant, qui effectue des accès à des adresses absolues et non des accès indexés, ce qui limite les performances maximales à une valeur de 10% selon l'indice exposé en 4.3. La performance mesurée est de 4.5% sur l'ensemble de la chaîne de traitement (obtention de la base, codage, décodage), ce qui est acceptable, compte tenu de la quantité de transcodages (entre entiers 8 bits signés et entiers 16 bits signés, 8 ou 16 bits signés et 32 bits signés...), et d'appels au Transputer (renormalisation, orthogonalisation...).

Les méthodes classiques montrent que la corrélation des points dans une image de télévision est sensible jusqu'à un voisinage de 8 par 8. Le même algorithme peut être aisément dérivé au contrôle en parallèle de 4 circuits pour réaliser cette tâche à une vitesse comparable à celle obtenue avec un
<figure><img src="image_37.png" /><figcaption>Figure 5.3: Image originale</figcaption></figure>

seul composant; la dimension de l'espace de projection peut être fixée à 16 pour conserver une qualité similaire, réalisant un taux de compression de 4 sans quantification.

Une autre solution pour améliorer le rapport signal/bruit a été étudiée dans [Si 89], et met en jeu plusieurs réseaux travaillant de façon compétitive, ce qui se prête bien au mode de contrôle du composant (mode SIMD).
<figure><img src="image_38.png" /><figcaption>Figure 5.4: Image décodée</figcaption></figure>

### 5.4.2 Reconnaissance de forme, apprentissage par rétropropagation du gradient

Une application en cours de développement actuellement est plus proche du modèle formel des réseaux de neurones: il s'agit d'utiliser un réseau à trois couches (une couche cachée) et un apprentissage par rétropropagation du gradient de l'erreur pour réaliser une reconnaissance de formes.

Etant donnée la taille du réseau, trois circuits suffisent pour l'implémenter: deux circuits représentent les interconnexions directes, de propagation, et un circuit est utilisé pour rétropropager l'erreur de la couche de
<figure><img src="image_39.png" /><figcaption>Figure 5.5: Image différence, amplifiée 16 fois</figcaption></figure>

sortie vers la couche cachée. Le détail de l'implémentation de l'algorithme de rétropropagation du gradient de l'erreur sur le composant neuromimétique (ainsi que l'algorithme de Kohonen) est présenté dans [Du 89]. Les étapes de cette implémentation sont les suivantes:

• (1) initialisation des poids $C_{ij}$;

• (2) présentation d'un nouveau vecteur d'entrée $V_i^0$;

• (3) calcul des états de neurones dans les couches suivantes $(V_i^k)_{k=1,K}$
de manière itérative:

$$V_i^k = f(\sum_{j=1}^{N_{k-1}} C_{ij}^k * V_j^{k-1});$$

• (4) calcul de l'erreur du neurones de sortie $i$, c'est à dire:

$$\delta_i^K = 2f'(\sum_{j'=1}^{N_{K-1}} C_{ij'}^K * V_j^{K-1}) * [(V_i^K)^{désiré} - V_i^K],$$

où $f'$ est la fonction dérivée de $f$;

• (5) rétropropagation des erreurs de la couche K à la couche 1:

$$\delta_j^{k-1} = 2f'(\sum_{j'=1}^{N_{K-1}} C_{ij'}^k * V_j^{k-1}) * \sum_{i=1}^{N_k} \delta_i^k C_{ij}^k;$$

• (6) mise à jour des coefficients:

$$Pour \ k \ de \ 1 \ à \ K \ W_{ij}^k(t+1) = W_{ij}^k(t) + \eta \delta_i^k V_j^{k-1},$$

où $\eta$ est le taux d'apprentissage;

• (7) retour à l'étape (2).

Les calculs sont réalisés en parallèle aux étapes (3), (5), et (6). Les étapes (3) et (5) demandent un produit scalaire entre une colonne de la Matrice Synaptique (entrée: états de neurones $V_j^{k-1}$), et de la Matrice Transposée (entrée: erreurs $\delta_i^k$ des neurones de sortie) respectivement. L'étape (6) peut être considérée comme un appel à la primitive d'apprentissage du composant, avec la Matrice Synaptique (entrée: états de neurones $V_j^{k-1}$), ou bien avec la Matrice Transposée (entrée: erreurs $\delta_i^k$ des neurones de sortie). La programmation du système en découle: un sous-système contient la Matrice Synaptique (DS), $W_{ij}^k$, pour $k$ de 1 à $K$. Un second sous-système contient la Matrice Transposée (TS), $W_{ji}^k$, pour $k$ de $K$ à 2. Les entrées sont $V_j^{k-1}$ et les erreurs $\delta_i^k$ (pout DS et TS respectivement). Les incrément sont $\Delta_i = \eta \delta_i^k$, et $\Delta_j = \eta V_j^{k-1}$ respectivement.

On peut remarquer qu'une initialisation effectuée de manière cohérente (étape (1)), ainsi que les modifications de l'étape (6) garantissent que la matrice TS reste la transposée de DS.
Le calcul par réseau de neurones intervient après un prétraitement d'une image saisie par une caméra, visant à obtenir le contour fermé de l'objet le long duquel des points sont répartis de façon isométrique sur le contour et avec lesquels on estime la courbure sur la station hôte (environ 70 points de calculs); le réseau, de taille 13 → 10 à 20 → $n$, où n est le nombre d'objets appris, est alimenté par une portion de 13 calculs de courbures, et indique si le point central est discriminant des objets appris; on déplace ensuite la portion de 13 points, jusqu'à obtenir un indice d'appartenance à l'un des objets en chaque point du contour ainsi sous-échantillonné, et un critère de décision indique l'objet reconnu (par exemple, la plus forte des sommes de la sortie de chaque neurone de sortie).

Pour cette application, le mode de contrôle choisi utilise les 2 Transputers de la carte Tnode, ce qui permet de se confronter au problème d'un contrôle parallèle de plusieurs jeux de circuits par plusieurs processeurs.

La programmation de cette application est l'occasion de se confronter aux problèmes liés à la dynamique limitée des coefficients, ce qui entraine une adaptation de l'algorithme pour gérer les cas de débordement en cours d'apprentissage.
Bibliographie

[Du 89] M. Duranton, J. A. Sirat 1989 "Learning on VLSI: a general purpose digital neurochip", Proc. Conf. IJCNN Washington DC, USA

[INM 88] INMOS Limited 1988 Transputer Development System, Ed. Prentice Hall

[INM2 88] INMOS Limited 1988 OCCAM 2 Reference Manual, Ed. Prentice Hall

[Si 89] J. A. Sirat, J. R. Viala, C. Rémus 1989 "Image compression with competing multilayer perceptrons", Proc. Conf. IEE Londres, No. 313

[Thee 90] Jean Bernard Theeten, Marc Duranton, Nicolas Mauduit, Jacques-Ariel Sirat 1990 Présentation orale, Third European Seminar on Neural Computing, Londres Fév. 90

[Walk 87] Paul Walker 1987 Dual Inline Transputer Modules (TRAMSs), INMOS Technical Note 29, 10 Dèc. 1987

[Wats 88] Trevor Watson 1988 Module Motherboard Architecture, INMOS Technical Note 49, Fév. 1988
# Chapitre 6

## Perspectives d'évolution
## 6.1 Exploitation des résultats

L'accroissement de la vitesse d'exécution des applications étudiées est si-
gnificatif, même si les performances maximales théoriques de l'architecture
restent encore éloignées: un gain d'un facteur 7 est obtenu dans l'application
de compression d'image par rapport son équivalent programmé sur un Trans-
puter seul, facteur que l'on peut sans doute doubler en changeant la librairie
d'appel aux mnémoniques du circuit; l'algorithme de rétropropagation du
gradient, en cours d'amélioration, bénéficie aussi d'un facteur d'accélération
sensible.

Certaines fonctionnalités disponibles sur le circuit n'ont pas été très
utilisées jusqu'à présent: en particulier, la possibilité d'utiliser un masque
(U) dédoublant la fonction d'apprentissage ne paraît pas utile pour les
algorithmes envisagés jusqu'à présent; les registres permettant de piloter
l'apprentissage par l'hôte en entrant à chaque pas de 1 bit le mot de com-
mande des unités d'apprentissage n'a pas été utilisé à d'autre fin que de test;
de même, la lecture de ce mot de commande par l'hôte ne prend de sens que
pour déterminer la cause d'un débordement, ce qui n'est pas détectable in-
dividuellement à cause de l'erreur de schéma sur l'ordre de mise à zéro du
registre d'état.

Les autres fonctions sont utilisées; la gestion des débordements n'a pas
donné lieu à un usage intensif jusqu'à présent, en raison des précautions
algorithmiques suivies, mais l'on peut raisonnablement avancer que le besoin
s'en fera sentir pour mettre au point d'autres algorithmes.

Les appels aux automates sont préférés, lorsque leur utilisation est possi-
ble (sur la carte TNode, plus sensible aux erreurs, la sollicitation plus intense
les composants par appel aux automates doit être évité pour certains cir-
cuits).

L'impression qui se dégage de l'utilisation des circuits est leur limitation
de dynamique des paramètres de calculs; une discipline de programmation
plus stricte est peut être à développer, ou bien une reconfigurabilité plus
grande dans cette direction peut être envisagée (à moins que l'on ne s'offre
un accroissement de la surface destinée à la mémorisation).
### 6.2 Architectures de systèmes basées sur ce circuit

La variété des architectures d'accueil potentielles du circuit est un atout pour sa diffusion: cartes plus ou moins optimisées à base de Transputers, cartes dédiées à une application... Les modes de contrôles disponibles sont utilisés selon les besoins en performances et la complexité de l'interface autorisée.

Après l'étude du contrôle d'un ensemble de circuits par une structure hôte parallèle (vaste sujet), l'étape suivante pour tester l'intérêt des possibilités du composant serait de mettre en œuvre les BUS dédiés, par la réalisation d'un automate externe, ou par la réalisation d'une carte optimisée pour une application.

Enfin, pour pousser ce circuit à atteindre des niveaux de performance plus élevés, la solution la plus efficace passe par le développement d'un microséquenceur pouvant prendre le contrôle du BUS hôte, afin d'enchaîner les instructions aussi vite que le circuit l'autorise (les différentes instructions n'ont pas toutes la même durée); cette structure délocalisée de contrôle peut être évolutive, pour permettre des itérations, des modifications de certaines parties des champs d'adresse, des sauts conditionnels...

## 6.3 Elargissements possibles du fonctionnement du circuit

### 6.3.1 Elargissement du domaine d'utilisation

Les primitives de calcul implémentées sont générales: le produit scalaire et le pas d'apprentissage, qui est une extension de la somme de deux vecteurs.

Ainsi, certaines opérations calculatoires peuvent être réalisées en faisant appel aux possibilités du circuit (même si son inadéquation à ces tâches doit maintenir marginales ce genre d'utilisations), comme par exemple le produit matriciel, les convolutions, les calculs de transformée de Fourier...

Un exemple de ce type d'utilisation élargie des fonctions du composant est illustré par l'application de compression d'image par analyse en composantes principales, avec l'appel aux primitives du circuit pour la détermination de la base principale d'un nuage de points, son orthogonalisation, la projection de ces points sur l'espace qu'elle engendre.
## 6.3.2 Elargissement des fonctionnalités

Certaines extensions à la structure du circuit ont déjà été proposées en vue d'accroître son efficacité ou ses possibilités: gestion plus complète des débordements arithmétiques, reconfigurabilité plus grande; Registre d'Etat de Neurones adressable sans notions de banque; coefficients synaptiques signés ou non en résolution pour simuler une dynamique supérieure en plusieurs cycles, ou implémentation d'un mode à précision étendue...

On peut aussi penser à des extensions fonctionnelles plus majeures:

* utilisation d'une matrice de coefficients synaptiques accessible en ligne et en colonne, afin de ne pas nécessiter l'emploi (et le contrôle) de circuits supplémentaires pour rétropropager l'erreur;

* ajout d'un canal interne de communication permettant d'échanger une ligne d'états de neurones avec une colonne de coefficients synaptiques: cela efface la séparation entre ces deux ressources mémoires, permettant une réallocation à l'une ou l'autre selon les besoins;

* implémentation de fonctions de renormalisation des coefficients synaptiques, afin d'éviter d'avoir à le faire par l'hôte pour les algorithmes qui le nécessitent;

* ajout de fonctions de recadrage pour traduire les formats de données à la volée entre les calculs effectués sur l'hôte et ceux conduits sur le circuit...

Des simulations, et l'étude des types de problèmes à aborder, indiqueront si ces évolutions sont rentables du point de vue de l'utilisation de la surface active qu'elles représentent en regard des fonctionnalités apportées.

## 6.4 Une machine neuronale: l'environnement logiciel

Les remarques des premiers utilisateurs des cartes dotées de circuits neuromimétiques ont rapidement souligné le manque de convivialité du mode actuel de programmation: il impose de bien connaître les spécifications techniques du composant, de faire le lien entre les fonctionnalités disponibles et les réponses éventuelles qu'ils peuvent apporter à un problème concret de simulation, et le plus souvent un recodage des paramètres du problème déjà étudié sur un ordinateur conventionnel pour qu'ils correspondent aux
exigences de dynamique du circuit. Cela exige un effort important qui n'est
motivé généralement que par une exigence de performance importante.

D'autre part, une certaine déception est manifestée lors de la comparai-
son des performances obtenues sur une application concrète aux performan-
ces théoriques de l'architecture utilisée. En effet, une connaissance approxi-
mative d'OCCAM et des possibilités du circuit, jointe à des mécanismes
de contrôle non optimaux pour des raisons de facilité de programma-
tion (éviter les appels à l'assemblée, les déplacements de la zone de
travail... mais aussi utilisation abusive des liens de communications, mul-
tiplications des processus...) entraîne une dégradation sensible des perfor-
mances du système.

Enfin, les fluctuations de l'algorithme que l'on désire implémenter et
un choix arbitraire parmi les différentes versions qu'il peut revêtir, dont
certaines sont plus efficaces que d'autres, contribue encore à la détérioration
du comportement du système.

La pleine utilisation de cette famille de systèmes passe par le
développement d'un outil de type compilateur-optimiseur, dont le rôle serait
de proposer une configuration d'utilisation efficace de la structure de calcul
disponible (reconfiguration du réseau de Transputers, du jeu de de circuits
par Transputer, interne des circuits) pour l'adapter à un problème de type
neuronal posé dans un langage de description à spécifier; la définition des
canaux de communications est sans doute importante pour l'efficacité du
partitionnement de la tâche à proposer (goulot d'étranglement habituel des
réseaux de neurones), mais aussi celle du flot de contrôle.
# Chapitre 7

# Conclusion
## 7.1 Bilan de la plate-forme de travail obtenue

La mise en œuvre de la plate-forme de simulation de réseaux neuromimétiques basée sur la réunion d'un circuit spécifique et d'une architecture parallèle, bien que de taille encore modeste aujourd'hui, a permis de cerner plusieurs points délicats liés à la conception et à la mise au point de ce type d'architectures dédiées, ainsi qu'à sa programmation.

La première remarque est sans doute très générale, mais est applicable au cas de cette étude: l'insuffisance des discussions avec les utilisateurs potentIELS, l'imprécision du cahier des charges, le manque de simulations à des degrés divers de représentation entraînent des lacunes fonctionnelles qu'une étude préalable plus poussée aurait aidé à combler. On peut principalement mentionner à ce titre les choix de dynamique des différents paramètres du réseau, le choix d'une structure cible particulière sans une étude détaillée comparative des autres solutions possibles (interfaçabilité privilégiée avec le Transputer INMOS), ainsi que l'élaboration d'un jeu d'instructions au fur et à mesure des besoins, sans s'attacher à son intégration dans un langage de commande de haut niveau (éventuellement à définir), qui est indispensable au développement du système.

Une autre remarque porte sur l'outil de conception du circuit: le début de cette phase a été retardé jusqu'à la disponibilité d'une chaîne de conception intégrée et complète; cette décision a été bénéfique: la sécurité conférée à cette tâche par les différents niveaux de vérifications effectués automatiquement par le logiciel et le bon interfaçage entre les différentes phases permet de maximiser les chances d'obtenir un prototype satisfaisant dès la première cuisson. D'autre part, cette attente a été mise à profit pour définir une primitive d'apprentissage implémentable de façon naturelle dans l'architecture, des automates et un mécanisme de contrôle permettant d'alléger la tâche de l'hôte, qui se sont avérés être des atouts majeurs de ce circuit.

Les premières utilisations du composant se sont heurtées à la rudesse de l'environnement de programmation: cela met l'accent sur l'importance de cet aspect, une architecture de machine n'étant validée que par sa programmation abondante et facile.

Plusieurs points positifs se sont dégagés de l'utilisation de ce module neuromimétique, lors de l'implémentation de l'application de compression d'image (non véritablement neuronale) et lors de la programmation de la rétropropagation du gradient de l'erreur:

* La rapidité de mise en œuvre, tant matérielle que logicielle, pour obtenir des premiers résultats, même s'ils restent modestes, est un
encouragement à poursuivre l'étude dans la direction des systèmes digitaux, en particulier si l'on désire un circuit d'usage suffisamment général pour qu'il puisse être utilisé dans différentes applications,

* La reconfigurabilité du système proposé est très sollicitée par les applications étudiées, qu'elles dérivent ou non du formalisme des réseaux de neurones. Cela nous a conforté dans le choix d'une souplesse d'utilisation, permettant le cas échéant d'utiliser le système pour des applications d'exigences différentes,

* La modularité permet de pallier en partie à la taille limitée du réseau représentable par un seul circuit, par la cascadabilité offerte, à la fois horizontale pour implémenter des réseaux plus grands, et verticale, pour les réseaux en couches,

* La généralité des primitives choisies autorise l'adaptation de ce module au calcul de plusieurs problèmes dont l'importance est encore une inconnue à ce stade de leur développement, et auxquels il n'était pas destiné au départ. Le circuit a été prévu pour le calcul des réseaux en couches ou pleinement connectés, mais il se révèle utilisable dans le cas de réseaux en arbres [Si2 90,Si3 90] (où le mode de sérialisation choisi permet de n'effectuer que les calculs nécessaires), dans le cas des réseaux d'ordre supérieur [Si 90] (par itérations successives sur plusieurs circuits), dans le cas des réseaux récurrents (car les neurones peuvent être mis à jour un à un dans n'importe quel circuit), dans le cas des réseaux à poids contraints (par la multiplication du nombre de circuits utilisés),

* Le développement d'un outil indicateur du degré d'efficacité de la programmation du circuit relativement à un environnement matériel donné a permis d'objectiviser cette notion, et permet d'optimiser les performances d'une application sans faire appel à une évaluation humaine de qualité toujours soumise à caution.

Un point faible (prévu au départ) de l'architecture est la représentation de réseaux de grande taille, en particulier les réseaux avec des matrices de connexions creuses.

Malgré le degré d'incertitude des spécifications initiales, le module neuromimétique montre un domaine d'usage assez large et un potentiel à expérimentations: le compromis retenu entre l'approfondissement des études préalables et l'obtention de résultats s'avère satisfaisant.
L'objectif initial de se doter d'une architecture accélérant les simulations de réseaux neuromimétiques est atteint, mais il reste un effort logiciel important à entreprendre pour rendre cette famille de systèmes exploitable. Le second objectif, l'étude de l'élaboration d'une architecture à plusieurs niveaux de parallélisme, basée sur la conception d'un composant spécifique modulaire et reconfigurable, ainsi que des moyens nécessaires au contrôle de cette famille de systèmes, a vu sa première étape aboutir avec la mise en œuvre de la carte TNode dotée de deux modules d'un Transputer et 4 circuits. De nombreuses étapes restent encore à franchir avant d'atteindre une bonne efficacité de ces systèmes.

La souplesse, le niveau de performance des systèmes déjà réalisés et les perspectives concernant les systèmes envisagés, ainsi que l'ouverture de cette plateforme de travail aux problèmes liés au parallélisme, justifient *a posteriori* l'effort de conception de cette architecture.

## 7.2 Perspectives d'évolution du sujet de recherche

La possibilité de simuler rapidement des réseaux neuromimétiques ouvre la porte à une exploration plus approfondie de ces systèmes, qui peuvent exiger un nombre suffisant d'unités pour adopter le comportement collectif que l'on en attend. De plus, l'architecture proposée semble être suffisamment souple pour permettre l'implémentation de plusieurs familles de réseaux (d'ordre supérieur, en arbre, récurrents...), et donc permettre des recherches dans ce domaine (si les contraintes portant sur la dynamique des paramètres ne s'avèrent pas trop limitatives), et pas seulement la programmation d'applications bien cernées pour les accélérer.

D'autre part, une voie d'étude vaste reste à défricher plus complètement: la spécification des mécanismes de contrôle d'un ensemble de circuits dédiés par une architecture d'accueil parallèle, d'un langage de description d'un problème neuronal et d'une architecture reconfigurable destinée à traiter ce problème, du partitionnement du problème sur la machine (ou la famille de machines).
7.3 Perspectives concernant la plate-forme de travail

L'élaboration d'une nouvelle version du module de base est prévue, après avoir tiré suffisamment d'enseignements de l'expérience en cours. Le développement de cartes contrôlées par des microprocesseurs plus classiques (par exemple de la série 68000 de Motorola) pourrait être entrepris, pour réaliser des postes d'évaluation peu coûteux de programmation du circuit et de l'utilisation de ses ressources.

La famille de systèmes fondées sur TNode va sans doute bénéficier de la production de modules similaires à celui déjà réalisé, mais sur des circuits imprimés, ce qui confèrerait fiabilité, reproductibilité et performances à ces machines d'usage général; de plus, cela permettra d'étudier les problèmes liés au parallélisme de l'architecture hôte, un Tnode pouvant contenir jusqu'à 64 circuits LNEURO avec ces cartes, pour 16 Transputers de contrôle.

Enfin, l'étude d'un microséquenceur est prévue, pouvant donner lieu à une réalisation si le gain en performance que l'on peut en attendre est suffisant.

Certaines limites sont intrinsèques à cette architecture: par exemple, la simulation de réseaux de grande taille, ou bien la simulation de réseaux de matrice de connexions creuse. Ces deux problèmes sont déjà étudiés par différents laboratoires. Une solution au premier problème peut provenir d'un mécanisme de pagination de morceaux de réseaux par une (ou plusieurs) unité de traitement fortement pipelineée, l'acheminement des données étant le goulot d'étranglement. Une solution au second problème peut venir de l'utilisation d'un circuit correspondant à un ensemble de synapses munies de sortes de pointeurs à chaque extrémité, avec lesquelles il est possible de réaliser tout type de réseau; la redondance d'information par rapport au sujet de cette étude, dont les synapses sont arrangées en couches, peut néanmoins devenir favorable si le degré de remplissage de la matrice de connexion est inférieur à l'inverse du taux de parallélisme du circuit LNEURO 1.0(1/16).

Une machine de simulation de réseaux de neurones d'usage général pourrait être élaborée à l'aide de plusieurs types de circuits, comme ceux évoqués ici, afin de pouvoir répondre efficacement à des problèmes de classes variées; une importante difficulté reste à surmonter: la conception des composants élémentaires de ce calculateur de façon que l'écriture d'un compilateur efficace reste aisée.
Bibliographie

[Si 90] J. A. Sirat, D. Jorand 1990 *Third order Hopfield networks: extensive calculations and simulations*, Philips J. Res. Vol. 44, No. 5, pp 501-519

[Si2 90] J. A. Sirat & J. P. Nadal 1990 *Neural Trees: A new tool for classification*, soummis à Network, avril 1990

[Si3 90] J. A. Sirat & J. P. Nadal 1990 *Neural Trees: A new tool for classification*, présenté à Snowbird Utah, U.S.A., Neural Network for Computing, 3-6 avril 1990
# Annexe A

## Mécanisme de contrôle de LNEURO

### A.1 Caractéristiques électriques du circuit LNEURO 1.0

Le circuit LNEURO 1-0 (version prototype) a été produit dans un boitier CPGA, 121 broches.

* Son domaine de fonctionnement de température ambiante est de 0 à 70 °C, de stockage -65 à +150 °C.

* Le domaine usuel de tension d'alimentation (avec pour référence VSS) est 4.75 V à 5.25 V, avec comme maximum impératif -0.5 V à +7 V.
  supply

* Le domaine de tension d'entrée est de -0.5 V à VCC +0.5 V.

* Le domaine de tension de sortie est de -0.3 V à VCC +0.5 V.

* La charge capacitive considérée comme appliquée aux sorties, pour les tests matériels comme logiciels, est 50 pF (par pin).
* La charge capacitive d'entrée, pour les tests matériels comme logiciels, est 10 pF (par pin).

* Le courant de fuite en entrée est reste inférieur à +/-10 µA.

* Le courant d'une sortie en haute impédance reste inférieur à +/-10 µA.

* La tension $V_{il}$ d'entrée basse pour un pad Schmitt est 2.8 V.

La tension $V_{ih}$ d'entrée basse pour un pad Schmitt est 2.3 V.

La tension $V_{il}$ d'entrée basse pour un pad CMOS varie de -0.5 V à 0.8 V (maximum).

La tension $V_{ih}$ d'entrée basse pour un pad CMOS varie de 2.0 V (minimum) à VCC +0.5 V.

La tension $V_{ol}$ de sortie basse pour les pads 4 mA et 8 mA est 0.4 V (maximum).

La tension $V_{oh}$ de sortie haute pour les pads 4 mA et 8 mA 2.4 V (minimum).

Le BUS BT[31..0] est bidirectionnel; le BUS BNSR[7..0] et son BUS adresse associé ADRBNSR[5:0] fonctionnent en lecture seulement; le BUS BE[31..0] est un BUS de sortie; le signal d'erreur est en collecteur ouvert (de façon à pouvoir être connecté en OU cablé avec d'autres circuits).

Remarque: durant les différents modes de test, les affectations des signaux aux pins peuvent être modifiées.

Pour plus de détails concernant le brochage du circuit, se référer à [Mau 90].

### A.1.1 Jeu d'instruction du circuit LNEURO 1.0

Les 19 bits d'adresse que le composant utilise sont considérés de la manière suivante: EENNNNNCAAAAAAAAAA. EE sont les deux bits
## A.1. CARACTÉRISTIQUES ÉLECTRIQUES DU CIRCUIT LNEURO 1.0157

d'extension du champs d'adresse AAAAAAAAAA requis pour l'instruction STEPREAD. NNNNN est le numéro du circuit adressé, en cas de contrôle SIMD (lorsque $C = 0$, chaque circuit contenant cette valeur dans son Registre Numéro est sélectionné par l'instruction). Jusqu'à 32 circuits peuvent être contrôlés indépendamment dans ce mode. Lorsque $C = 1$, le contrôle du circuit adressé est explicite (par un décodage matériel externe), réalisé par la mise au niveau bas de la pin NotCs. AAAAAAAAAA représente le champs d'adresse, où, pour chaque instruction, une partie de ces 11 bits forme l'instruction, quelques bits pouvant être une adresse immédiate. De plus, l'entrée NotCs doit être au niveau bas pour toute lecture du composant.

Les 16 LSB NNNNCAAAAAAAAAA sont suffisants pour contrôler un nombre réduit de circuits en mode SIMD par un processeur doté d'un BUS 16 bits (comme le Transputer T212, par exemple), dans un mode légèrement dégradé.

### A.1.2 BUS d'entrée/sortie dédiés

D'autre BUS sont dédiés à des tâches plus spécifiques, pour les applications nécessitant un niveau de performance élevé, et pour lesquelles un développement matériel plus compliqué est accepté. Un BUS 32 bits, BE, sort constamment un résultat de résolution, la sortie de l'Arbre d'Additionneurs, ou bien le contenu de l'Accumulateur Final. Un BUS 8 bits, BNSR, peut entrer un état de neurone, à l'adresse fixée par le BUS 5 bits AdrBNSR, et sur le signal ClkBNSR.

### A.1.3 Commandes accessibles par un contrôle externe

Quelques commandes sont accessibles sans passer par un ordre du BUS hôte: RAMTOLATHI, STEPAUTO, WRITENEUR. Ces trois ordres sont appelés par l'état de deux pins particulières, le quatrième état possible étant l'état de repos, dans lequel le circuit doit se trouver lors des changements de mode (qui est établi par une instruction standard sur le BUS de contrôle). Dans le mode de fonctionnement correspondant, la fin du déroulement de l'automate de résolution est signalée par une pin particulière, permettant de synchroniser le seuillage.

Certaines instructions peuvent être activées simultanément (par exemple, des chargements de registres portant sur des portions différentes du BUS, ou avec les mêmes données).
## A.2 Jeu d'instruction du circuit LNEURO 1.0

La liste qui suit, extraite de [Mau 90], détaille chaque instruction.

In the following description of the LNEURO instructions, the addresses encoded on 11 bits are the LSB AAAAAAAAAA. An x represents a 'don't care' bit. In brackets is the way to use the instruction (instruction meaning; read or write, the data possibly taken into account).

### A.2.1 Data transfer instructions

* WRITESYN: 000$a_7$a_6$a_5$a_4$a_3$a_2$a_1$a_0$ (WRITE SYNaptic memory; write data)

Writes the synaptic memory via BT bus; the first two bits $a_7$a_6 determine one of four sets of four eight bit synaptic coefficients: $a_7$a_6 = '00' for $W_{0,j}$ to $W_{3,j}$, $a_7$a_6 = '01' for $W_{4,j}$ to $W_{7,j}$, $a_7$a_6 = '10' for $W_{8,j}$ to $W_{11,j}$, $a_7$a_6 = '11' for $W_{12,j}$ to $W_{15,j}$. The remaining 6 bits $a_5$a_4$a_3$a_2$a_1$a_0$ determine the column of weight being accessed. For example, loading the hexadecimal value 'Hffddbbaa at the address '$a_7$a_6$a_5$a_4$a_3$a_2$a_1$a_0$' = '10000011' corresponds to the column of weights number 3 ($a_5$a_4$a_3$a_2$a_1$a_0$, in 0 to 63); so the values stored in the four weights that correspond to the neurons state number 8 to 11 are 'Hff for $W_{11,3}$, 'Hdd for $W_{10,3}$, 'Hbb for $W_{9,3}$, 'Haa for $W_{8,3}$. Remark: any of the four NotMemWr[i] going low will execute the Write operation, as they are logically ORed, so synaptic coefficients are written four at a time.

* READSYN: 000$a_7$a_6$a_5$a_4$a_3$a_2$a_1$a_0$ (READ SYNaptic memory; read data)

Reads the synaptic memory via BT bus as in WRITESYN (same address).

* RAMTOLATLO: 01010aaaaaaaa (synaptic RAM column TO learning LATch LOw bytes; read)

Transfers a column of 16 weights from the synaptic memory address @aaaaaaaa to the latch LSB (Read and Write operations are referenced to the RAM, so a RAMTOLATLO writes in the Learning Latch LSB the content of the RAM address @aaaaaaaa).

* LATLOTORAM: 01010aaaaaaaa (learning LATch LOw bytes TO synaptic RAM column; write)
Transfers a column of 16 weights from the latch LSB to the synaptic memory address @aaaaaa.

* RAMTOLATHI: 01011aaaaaaaa (synaptic RAM column TO learning LATch HIgh bytes; read)

Transfers a column of 16 weights from the synaptic memory address @aaaaaaa to the latch MSB.

* LATHITORAM: 01011aaaaaaaa (learning LATch HIgh bytes TO synaptic RAM column; write)

Transfers a column of 16 weights from the latch MSB to the synaptic memory address @aaaaaaa.

* RAMTOLATAUTO: 010000aaaaaaaa (two synaptic RAM columns TO learning LATch AUTOmatically; read)

Starts the automaton for sixteen bit synaptic weights exchanges between the synaptic memory and the Incrementor Latch, in parallel for the 16 neurons. Two columns of the synaptic memory are concerned by this instruction: the address @0aaaaaa corresponds to the 8 LSB of the sixteen bit weights, and the address @1aaaaaa to the 8 MSB.

* LATTORAMAUTO: 010001aaaaaaaa (learning LATch TO two synaptic RAM columns AUTOmatically; write)

Works as RAMTOLATAUTO, in the inverse way (write).

* WRITENEUR: 01100xxxa₂a₁a₀ (WRITE NEURons state on BT; write, data)

Accesses the neural state register via bus BT; 32 bits represent a set of four eight bit neurons that can be written one at a time by the use of the corresponding write signal from the 4 available (NotMemWr[3:0], NotMemWr[k] for neuron number 4*i + k, i='a₁a₀'); the first bit of address a₂ chooses the bank (a₂ = '0', bank zero; a₂ = '1', bank one), and the remaining two LSB a₁a₀ the set number i of 4 neurons (the neurons corresponding to a NotMemWr[i] that does not change keep their former values).

* READNEUR: 01100xxxa₂a₁a₀ (READ NEURons state on BT; read, data)

Same as WRITENEUR, but four 8 bit neurons are always read, as there is only one signal NotMemRd which is generated by the Transputer.
## A.2.2 Learning instructions

The Learning Register can be controlled either by the microcoded local function F, the neurons state $V_j$, or by Learning Function Latches: a multiplexor allows to choose between latches and local Learning Function the origin of the control of the Learning Register separately for the ± Delta control and for the *0/1 Delta control.

The control of the Learning Register (either from Learning Function Latches or from local Learning Function F) works as follows: a 0 for ± Delta adds the corresponding Delta, a 1 subtracts Delta; a 0 for *0/1 Delta multiplies the corresponding Delta by 0, a 1 multiplies Delta by 1.

The learning process can be automatic or step by step; in both cases, the NSR line address is determined by ADRU, automatically incremented from 0 to 7 in automatic mode. The NSR bank is determined by P[3] (cf resolution mode paragraph).

* **LOADDELTA: 110xxxxx1xx (LOAD DELTA learning parameter; write, data)**

Writes the Delta learning parameter with BT[15:0].

* **LOADU: 110xxxx1xxx (LOAD U Learning Function microcode; write, data)**

Writes the U, a part of the Learning Function microcode; the corresponding part of the Learning Function produces one bit at a time, that is addressed by the 3 bit address @ADRU in the same way as NSR is addressed in case of a LEARNAUTO instruction; the 8 bit value of U is loaded with BT[7:0].

* **LOADF: 110xxx1xxxx (LOAD F microcode; write, data)**

Writes the F Learning Function microcode with BT[15:8]. The 8 bit F microcode 'abcdefgh' controls the Learning Function as a truth table (if their output is not from the latch): the four MSB 'abcd' apply to the ± Delta part of the function, and the four LSB bit 'efgh' to the *0/1 Delta function. For the two parts of the function, the output depends on the 16 $V_j$ and on the microcode U that are considered one bit at a time. If U outputs 0, the odd bits 'xy' of F ('ac' or 'eg') determine the function of $V_j$ to get the result of the Learning Function: 'xy' = 00 gives 1; 'xy' = 11 gives 0; 'xy' = 10 gives $V_j$; 'xy' = 01 gives $\bar{V}_j$. If U outputs 1, the even bits of F ('bd' or 'fh') determine the function of $V_j$.
$V_j$. When F produces 0 for $\pm$ Delta, the corresponding Delta is added, and subtracted when it produces 1; for the *0/1 part, a 0 means Delta is multiplied by 0, and 1 multiplied by 1.

As the $\pm$ Delta function is inversed by specific hardware for the MSB bit in automatic mode for 2's complement multiplication, a microcode for F that is '11111100' corresponds to a learning scheme where each weight is updated by Delta * $V_j$, for instance. In step by step mode, the same result would be obtained by a microcode for F that is '11111100' for the seven first steps, and a microcode for F that is '00001100' for the MSB step, for example. For each step the address of the current bit of neurons state has to be set by parameter ADRU, the NSR bank being set by P[3] from the last instruction LOADCODALUAUTO. One can remark that the content of U is not taken into account here, for odd bits of the microcode for F, 'aceg', are equal to even bits, 'bdfh'.

* **LATCHMULTLEARN:** 110x01xxxxx (set on LATCH Delta MULTplying LEARNing microcode; read, write)
  Sets the learning multiplexor for the *0/1 Delta parameter to come from the Learning Function Latch.

* **LATCHADDLEARN:** 110x10xxxxx (set on LATCH Delta ADDing LEARNing parameter; read, write)
  Sets the learning multiplexor for the $\pm$ Delta parameter to come from the Learning Function Latch.

* **LOADPLUSLEARN:** 110xxxxxxxx1 (LOAD PLUS/minus Delta LEARNing parameters; write, data)
  Writes the content of the Learning Function Latch with BT[15:0]; this register is for the $\pm$ Delta learning parameter.

* **LOADZEROLEARN:** 110xxxxxx1x (LOAD * ZERO/one Delta LEARNing parameters; write, data)
  Writes the content of the Learning Function Latch with BT[31:16]; this register is for the *0/1 Delta learning parameter.

* **RESETMUXLEARN:** 110x11xxxxx (RESET Delta adding and multi-plying MUltipleXing LEARNing parameter; read, write)
  Resets the learning multiplexor in order to have the *0/1 Delta pa-rameter and the $\pm$ Delta parameter being locally computed by the Learning Function F (not from latches).
* WRITEADRU: 100111aaa01 (WRITE ADdRess of U learning microcode; read, write)
  Loads the address aaa of the U learning microcode immediately (not by data).

* READLEARNF: 10000xxxxxx (READ output of LEARNing Function; read, data)
  Reads the output of the Learning Function on BT (the 16 MSB are the command bits for *0/1 DELTA, the 16 LSB for ± DELTA).

* LEARN: 0111xxxxxxx (LEARNing step; write)
  Executes one learning step: as the adder-subtractors for learning work asynchronously, the result of the learning is computed as soon as the input parameters are set, so the learning step only consists in latching these results in the Learning Register. In case of overflow, the NotOvrGene signal will go low and the result of this computation will not be stored in the Learning Register.

* LEARNU: 0110101xxxx (LEARNing step after loading U microcode; write, data)
  Executes one learning step after loading of U by data. In case of overflow, the result of the computation is latched anyway and NotOvrGene signal stays inactive.

* LEARNADRU: 100111aaa11 (LEARNing step after writing the ADdRess of U learning microcode; write)
  Loads the address aaa of the U learning microcode immediately (not by data), and performs an LEARN-like instruction in the same step. In case of an overflow, the result of the computation is not latched, and NotOvrGene signal stays inactive.

* LEARNAUTO: 100110xxx11 (8 LEARNing steps AUTOmatically; read, write)
  Starts the automaton for the learning phase, which multiplies Delta by the 8 bit neurons state in 2's complement, and adds this product to the $W_{ij}$; the address for selecting one bit of the microcode U is incremented automatically from 0 to 7 as the address of the neurons state. In case of overflow, the computation stops before latching the partial results corresponding to the bit having produced the overflow, and NotOvrGene signal becomes active.
* LEARNUAUTO: 0110100xxxx (LEARNING step after loading U AUTOMATICALLY; write, data)

Starts the learning automaton like LEARNAUTO after the loading of U by data.

### A.2.3 Resolution instructions

* SETCLRALU: 101xxx1x010 (SET CLeaR mode for ALU automaton; read, write)

Sets the final ALU automaton in a mode where a clear of the content of the accumulator is done at the beginning of a STEPAUTO or a WRITEACCU.

* RESETCLRALU: 101xxx1x011 (RESET CLeaR mode for ALU automaton; read, write)

Sets the final ALU automaton in a mode where no clear of the content of the accumulator is done at the beginning of a STEPAUTO or a WRITEACCU.

* LOADCODALUAUTO: 101xxx10100 (LOAD microCODE of ALU AUTOMaton; write, data)

Stores the microcode for the final ALU automaton. The microcode 'abcdefgh' for the ALU is located at BT[31:24], where 'a' determines the action to be done for the MSB intermediate result, 'h' for the eighth result, the LSB. A '1' produced means an addition of the corresponding intermediate result into the accumulator (a '0' means a subtraction). The microcode for the shifter is located at BT[23:16], a '1' meaning that the corresponding partial result in the accumulator is to be shifted to the left before storing the next partial result into the accumulator, thus serializing the MSB first (a '0' means no shift). The Offset is located at BT[10:8]; the parameter P at BT[3:0]. Those four parameters can be updated independently by the use of the corresponding Not-MemWr[i], with i from 0 to 3 for P, Offset, the shifter microcode, and the ALU microcode in that order, the remaining parameters being left unchanged.

* WRITEACCU: 1x1sxx10101 (WRITE final ACCUmulator; write, data)

Writes into the final accumulator through the final ALU, the other
operand being the former content of the final latch. If $s = 0$, a subtraction between the former content of the accumulator and $BT[31:0]$ occurs, an addition if $s = 1$.

* **STEPREAD:** $e_3a_5NNNNC001e_2e_1e_0a_4a_3a_2a_1a_0$ (resolution STEP and READ result on BT; read data)

Reads the output of the Tree of Adders after computation with the synaptic weights column of address $a_5a_4a_3a_2a_1a_0$ (performing a RAMTOLATHI-like Read of the RAM), and with the neural states line of address $e_3e_2e_1e_0$, with the addresses concatenated with their MSB extension $a_5e_3$ in the case of 32 bit host controller.

* **STEPAUTO:** $101xxxx1xxx$ (resolution STEP(s) AUTOMATICALLY; read, write)

Starts the final ALU automaton. The computation is done with the NSR bank zero or bank one (no crossing from one bank to the other in the same instruction). The bank number is stored into the parameter $p_3$, with $P = 'p_3p_2p_1p_0'$ parameter stored by LOADCODALUAUTO. The serialization starts with the MSB of neurons state, at the line located OffSet + '$p_2p_1p_0$', to the LSB, at the line located OffSet (the microcode for controlling the ALU and the shifter produces the code beginning with the MSB, that is $a_7$ where $a_7a_6a_5a_4a_3a_2a_1a_0$ is the microcode). For 5 bit neurons state, stored in the top of NSR bank one, the parameter P should be set to '1100', and OffSet to '011'. When an overflow occurs on the final ALU, the content of the Final Accumulator remains the same than before the step that caused the overflow, and a one is stored into the Status Register bit 0.

## A.2.4 General purpose instructions

* **INIT:** $111xxxxxxx$ (INITialisation; read, write)

Resets the circuit (Learning Function parameter Delta, Learning Function microcode F, U, microcode for final ALU automaton, number of the chip are set to 0), and places it in the same configuration than after SETCLEARALU, LATCHMULTLEARN, LATCHADDLEARN, ACCUONBE, and with mode ENABEXTAUTO disabled. Neither the synaptic memory nor the Neural State Register are re-initialised. IMPORTANT: the first instruction following an INIT is ignored, so a NOP should be put after any INIT.
* LOADCHIPNUM: 10010xxxxxx (LOAD CHIP NUMber; write, data)
Stores the circuit's number for SIMD control mode with BT[16:12].

* READACCU: 1x1xxx10101 (READ final ACCUmulator; read, data)
Reads the content of the final accumulator on BT.

* READOVRSTAT: 10011xxxxx0 (READ OVeRflow's STATus register; read, data)
Reads BT[0] for checking whether the overflow has occured on the final ALU (if BT[0] = 1). Overflow on learning adders are not yet available. Overflow concerning the Learning Registers are cleared by the first write executed on the circuit (except with LEARN, LEARNUAUTO or LEARNAUTO), or by RAMTOLATAUTO, RAMTOLATLO, RAMTOLATHI.

*Remark*: the way of evaluation of the overflow was implemented for one step operations, and may lead to more overflow occurences than necessary in the case of automatic multi-step computations. Attention should be paid in such a case to check if an overflow has really occured.

* CLROVRSTAT: 10011xxxxx0 (CLeaR OVeRflow's STATus register; write, data)
Clears the final ALU overflow signal, writing 0 in BT[0].

* RDARBBT: 101xxx10000 (READ TREE; read, data)
Reads the output of the tree of adders on BT.

* ACCUONBE: 101xxx1x110 (multiplexes Final ACCUmulator ON BE; read, write)
Sets BE bus to produce the content of Final Accumulator.

* TREEONBE: 101xxx1x111 (multiplexes TREE of adders output ON BE; read, write)
Sets BE bus to produce the content of the final stage of the Tree of Adders.

* WRITEBNSRADRBT: 10001xaaaaa (WRITE BNSR in NSR at address ADRBT; write)
Stores a neuron state from BNSR at address aaaaa.

* SETENABEXTAUTO: 0110110xxxx (SET ENABle EXTernal AUTomaton mode; read, write)
Sets the circuit in a mode enabling the use of an external automaton to
序列化计算 neurons。在该模式下，NotClkBNSR going low 与 RamLatHExt low 读取 Synaptic Memory 的地址 AdrBNSR[5:0]；然后 RamLatHExt going high 储存这些系数 in Learning Register MSB， thus enabling the multiplication with the first bit of neurons state determined like for STEPAUTO instruction. NotClkBNSR going high 与 RamLatHExt high 储存一个 neuron state from BNsr[7:0] 在 Neural State Register 的地址 AdrBNSR[4:0]。在该模式下，NotCalcExt going high 起到 resolution automaton (performs a STEPAUTO)；任何 Read 指令 by BT (internal or external) 是 disabled， as well as any Write into NSR via BT.

* **RESETENABEXTAUTO: 0110111xxxx (RESET ENABLE EXTERNAL AUTOMaton mode; read, write)**
  Resets this mode back to the mode controlled by BT.

* **NOP: 101x1000xxx, 101x11xxxxx, 101xxx10001, 110x00xxxxx (NO OPERATION; read, write)**
  Performs no operation on the circuit.
# Annexe B

## LNEURO 1.0 dans une carte SuperNode

La figure B.1 rappelle les diagrammes de séquencement des signaux de contrôle du Transputer INMOS.

<figure><img src="image_40.png" /><figcaption>Figure B.1: Cycle du Transputer INMOS</figcaption></figure>

Les figures B.2, B.3, B.4, B.5 décrivent les schémas d'un module pour carte mère TNode (quatre circuits LNEURO 1.0 sont présents sur la carte, et leur adresse est fixée par les équations des PALs de décodage et la position des straps). Le Transputer est doté de 1, 2, 4, ou 8 Moctets de RAM dynamique (sans état d'attente jusqu'à 25 MHz), et du composant spécifique (Control Gate Array) aux machines Tnode pour la gestion de leur
CONTROL BUS 8 bit; les composants neuromimétiques sont accompagnés de circuits pour le multiplexage des phases adresse et donnée du BUS Transputer, d'amplificateurs électriques en raison du nombre de circuits potentiellement connectés au BUS Transputer (dans le cas où 8 Moctets de RAM sont implantés), ainsi que du mécanisme reliant les signaux OVR des circuits à un registre d'état, accessible en lecture et écriture par le Transputer, et permettant de générer une interruption masquable sur le CONTROL BUS du Tnode en cas de débordement sur l'un des composants neuromimétiques.
<figure><img src="image_41.png" /><figcaption>Figure B.2: Schéma d'un module pour carte mère TNode, partie Transputer</figcaption></figure>
<figure><img src="image_42.png" /><figcaption>Figure B.3: Schéma d'un module pour carte mère TNode, partie Transputer</figcaption></figure>
<figure><img src="image_43.png" /><figcaption>Figure B.4: Schéma d'un module pour carte mère TNode, partie LNEURO</figcaption></figure>
<figure><img src="image_44.png" /><figcaption>Figure B.5: Schéma d'un module pour carte mère TNode, partie LNEURO</figcaption></figure>
# Annexe C

## Exemples de programmation

Le code qui suit est une partie de la bibliothèque de traduction des appels aux composants neuromimétiques en mnémoniques (tout ce qui suit -- dans une ligne d'OCCAM est considéré comme commentaire).

```
from.gest ? CASE -- tout appel au circuit se fait ici
                      -- par écriture dans un CHANEL
```

```
-- ++ readsyn
```

```
INT nram,ncol,weight,adresse:
```

```
readsyn;NumC;nram;ncol
```

```
-- lecture de la RAM
```

```
-- NumC = numero logique du circuit
```

```
-- weight = valeur recuperee dans la RAM
```

```
-- nram = n. de la RAM
```

```
-- ncol = n. de la colonne
```

```
SEQ
```

```
adresse := (((nram <<6) \ ncol) <<2) \ #C0402000
```

```
GUY
```

```
    LDL adresse
```

```
    LDNL O
```

```
    STL weight
```

```
to.gest ! weight
```

```
-- ++ stepauto
```

```
INT adresse:
```
stepauto;NumC
-- etape de resolution
SEQ
adresse := #C0003420
GUY
LDL adresse
LDNL 0

Le code qui suit est un exemple d'appel aux fonctions neuromimétiques d'un circuit, réalisant la configuration de l'automate de résolution pour des calculs signés en complément à deux, portant sur des neurones 8 bits, et le calcul d'une étape de résolution pour une couche de 13 neurones.

-- configuration automate de l'alu
to.chip ! loadcodaluauto ; #7FFF0007
-- mode de remise a zero de l'alu
to.chip ! setclralu

SEQ i=0 FOR 13
SEQ
  to.chip ! ramtolathi ; i -- chargement des poids
  to.chip ! stepauto      -- automate de resolution
  to.chip ! readaccu      -- lecture du resultat

from.chip ? resu
neurone[i] = resu

Le code qui suit est un exemple d'appel aux fonctions d'apprentissage du circuit, comprenant le chargement d'une colonne de coefficients synaptiques dans les Registres d'Apprentissage, l'initialisation de $\Delta$ et de la fonction d'apprentissage, suivie par la séquence de commandes réalisant une étape d'apprentissage pas à pas pour des états de neurones codés sur 8 bits.

-- positionnement du mux d'apprentissage
to.chip ! resetmuxlearn
-- chargement des poids de la colonne 0
to.chip ! ramtolatauto ; 0
to.chip ! loadf ; #FC -- fonction d'apprentissage
SEQ i=0 FOR 8 -- boucle sur les 8 bits des etats
SEQ
IF
i=7
-- traitement bit de poids fort
-- en complement a 2
to.chip ! loadf ; #OC (BYTE)
TRUE
SKIP
-- chargement de delta
to.chip ! loaddelta ; delta
-- un pas d'apprentissage
to.chip ! learnadru ; BYTE(i)
-- shift de delta
delta := delta << 1
Bibliographie

[Mau 90] N. Mauduit 1990 *Preliminary data sheet: the neuromimetic circuit*
*LNEURO 1.0, doc. int. Philips No. B 90 556, July 1990*