Méthodes de simulation logicielle pour Esterel Dumitru Potop-Butucaru

Download Report

Transcript Méthodes de simulation logicielle pour Esterel Dumitru Potop-Butucaru

Méthodes de simulation
logicielle pour Esterel
Dumitru Potop-Butucaru
Sommaire
•
•
•
•
•
Généralités
Le simulateur Esterel v3 et le format LC
L’approche CNET
Le compilateur Synopsis
Une nouvelle approche (la mienne)
Historique
• 1984 – L. Cosserat, first SOS rules, simulateur v2
• 1988 – G. Gonthier, better SOS rules, state encoding,
simulateur v3, format LC
• 1991 – G. Berry, compilation en circuits
• 1995 – sémantique constructive
• 1999 – Le compilateur Synopsys – méthodes
classiques de compilation (S. Edwards)
• 1999 – Le compilateur CNET – simplification
statique de la sémantique v3 (V. Bertin, E.
Closse, D. Weil, etc.)
• 2002 – J. Potop – combinaison de techniques en circuits et
de méthodes classiques de compilation
Généralités
• Langages séquentiels traditionnels(e.g. C)
– flot d’exécution, compteur de programme
• Parallélisme et synchronisation
– plusieurs threads d’exécution
– points d’attente, ordonnancement
• Synchronie
– réaction à l’absence (décision de déblocage
par analyse du code pas encore exécuté)
Généralités
• Parallélisme et synchronisation
– ordonnancement
• dynamique
• statique
– notion de programme acyclique
– limite la classe de programmes corrects
• Synchronie
– comment décider l’absence d’un signal?
• dynamiquement – fonctions de potentiel appelées a l’exécution
• statiquement – acyclicité => pas besoin de fonctions de potentiel
Généralités
• Sémantique d’Esterel:
– règles SOS
– fonctions de potentiel pour déterminer
l’absence d’un signal
• Versions:
– v3 – fonctions de potentiel simples
– v5 – sémantique naturelle en circuits,
propagation d’informations dans du code
pas encore exécuté
Solutions implémentées
• Simulateur Esterel v3:
– ordonnancement dynamique, avec files
– fonctions de potentiel
• Nouvelles approches:
– ordonnancement statique
• code acyclique
• réincarnation
– pas de calculs dynamiques de potentiels
Le simulateur Esterel v3
• Ordonnancement dynamique utilisant 2
files:
– file de threads bloqués attendent la
stabilisation d’un signal
– file de threads non-bloqués qui attendent
d’être exécutés
– quand la file d’exécution est vide on appelle
des fonctions de potentiel qui débloquent des
threads.
Le simulateur Esterel v3
• Format intermédiaire pour accélérer la
simulation: IC/LC
• IC=intermediate code
• LC=fully linked IC
Le format IC – syntaxe
• Elements de structure:
– les points d’arrêt
– la hiérarchisation des points d’arrêt (arbre de
reconstruction)
• Le graphe de flot de contrôle, greffé sur
l’arbre de reconstruction
Le format IC – exemple 1
module ex:
input S ; output O ;
abort
pause ;
emit O ;
pause
when S ;
end module
0: Return: 0
1: Pause: (2) <4> 1
2: Emit: [1] (3)
3: Pause: (0) <4> 2
4: Watchdog: {5} <0>
5: Present: [0] (0,4)
start
RETURN
WATCH
DOG
F
PAUSE
O
S
PAUSE
T
Le format IC – exemple 2
start
module ex2:
output O1,O2,O3 ;
signal S in
emit O1 ;
present S then emit O2 end
FORK
pause ;
||
O1
S
emit S ;
pause
S
end signal ;
T
F
emit O3
end module
O2
RETURN
O3
PARALLEL
PAUSE
PAUSE
Le format IC – exemple 3
start
module ex3:
output O ;
loop
trap T in
pause ;
exit T
||
loop
emit O ;
pause
end loop
end trap
end loop
end module
RETURN
FORK
PARALLEL
T
O
PAUSE
PAUSE
Le format IC – exemple 4
start
module ex4:
output O ;
loop
signal S in
present S then emit O end ;
pause ;
emit S
end signal
end loop
end module
RETURN
reset S
T
S
F
O
PAUSE
S
Le compilateur CNET
• Identifie les points d’attente ou des threads
peuvent être bloqués (instructions pause et
tests).
• Ordonne statiquement les points d’attente
• Exécution = parcours de la liste des points
d’attente
• Problème: caractériser les programmes
acceptés par le compilateur
CNET: format intermediaire specifique
module ex:
input S ;
abort
pause ;
emit O ;
pause
when S
end module
start
ROOT
WATCH
DOG
F
PAUSE
O
S
PAUSE
T
CNET: format intermediaire specifique
start
ROOT
PauseOn
ROOT
PauseOn
PauseOff
?S
+off
nothing
on
WATCH
DOG
-PauseOn
+off
emit O
PauseOn
F
nothing
PAUSE
O
S
PAUSE
T
CNET: ordonnancement statique
ROOT
PauseOn
ROOT
PauseOn
PauseOn
PauseOn
PauseOff
PauseOff
?S
?S
+off
-PauseOn
-PauseOn
+off
+off
nothing
on
emit O
+off
PauseOn
nothing
on
emit O
PauseOn
nothing
nothing
CNET: interleaving
encodage de parallel
module ex2:
output O1,O2,O3 ;
signal S in
emit O1 ;
present S then emit O2 end
pause ;
||
emit S ;
pause
end signal ;
emit O3
end module
start
RETURN
O3
FORK
O1
T
S
PARALLEL
S
F
O2
PAUSE
PAUSE
CNET: interleaving
encodage de parallel
on
emit O1
on
on
FORK
on
emit S
on
O1
PARALLEL
S
POn
count--POn
on
count--
T
on
S
F
O2
emit O2
POn
nothing
O3
count==0
?S
+on
RETURN
+on
count=2
on
start
emit O3
ROOT
PAUSE
nothing
PAUSE
CNET: interleaving
encodage de parallel
emit O1
emit O3
ROOT
on
count=2
on
emit O1
on
POn
on
on
emit S
on
?S
-POn
POn
count--POn
on
+on
emit O2
POn
count-nothing
emit O2
on
on
count--
on
nothing
on
POn
nothing
on
count=2 on
count==0
?S
+on
ROOT
+on
on
count--
on
nothing
count==0
+on
emit O3
on
emit S
CNET: réincarnation
module ex3:
output O ;
loop
trap T in
pause ;
exit T
||
loop
emit O ;
pause
end loop
end trap
end loop
end module
RETURN
start
FORK
PARALLEL
T
O
PAUSE
PAUSE
CNET: réincarnation
ROOT
+on
exit=0
exit==2
on
POn
RETURN
start
on
on
emit O
POn
exit=2
FORK
PARALLEL
T
on
O
nothing
nothing
on
PAUSE
PAUSE
CNET: réincarnation
ROOT
+on
exit=0
exit==2
on
POn
RETURN
start
on
on
emit O
POn
exit=2
FORK
PARALLEL
T
on
O
nothing
nothing
on
PAUSE
PAUSE
CNET: réincarnation
ROOT
ROOT
on
on
+on
exit=0
exit==2
on
POn
on
emit O
POn
nothing
nothing
exit=2
+on
exit=0
on
POn
exit==2
on
emit O
exit=2
POn
on
on
nothing
nothing
on
POn
emit O
on
CNET: réincarnation
ROOT
on
on
ROOT
+on
exit=0
nothing
on
exit=2
POn
nothing
on
emit O
on
on
POn
emit O
exit=2
POn
+on exit==2
POn
POn
exit=0
on
exit==2
on
nothing
nothing
emit O
on
POn
emit O
on
CNET: signal local
module ex4:
output O ;
loop
signal S in
present S then emit O end ;
pause ;
emit S
end signal
end loop
end module
start
RETURN
reset S
T
S
F
O
PAUSE
S
CNET: signal local
start
ROOT
RETURN
on
reset S
on
reset S
?S
-POn
+on
emit O
T
on
POn
nothing
on
emit S
S
F
O
PAUSE
S
CNET: signal local
ROOT
ROOT
on
on
reset S
nothing
on
on
emit S
on
?S
-POn
+on
reset S
emit O
on
POn
POn
on
-POn
nothing
on
emit S
?S
+on
emit O
Le compilateur CNET
• Optimisations du graphe: effacement d’arcs et
de nœuds
• Encodage d’état pas optimisé par rapport a LC –
en général très redondant
• Parcours linéaire des points d’attente a chaque
instant
• Réencodage bas-niveau des traps qui restreint
la classe de programmes représentables
Le compilateur Synopsys
• Exploite la hiérarchie du programme avec des algorithmes
d’ordonnancement statique classiques
• Génère un code bien structuré basé sur de la propagation
de contrôle – structures de données distribuées
localement dans le corps du programme.
• Représentation intermédiaire hiérarchique: graphe de flot
de contrôle concurrent (CCFG), avec encodage d’état
implicite
• Problème: caractériser les programmes acceptés par le
compilateur
Le compilateur Synopsys
• Thread = composante séquentielle a un
niveau donne du CCFG
• Chaque thread a 2 entrées de contrôle
(start et resume) et une sortie de contrôle
• Chaque thread a une variable qui définit
l’état local courant et une variable dans
laquelle on calcule l’état pour l’instant
suivant
Le compilateur Synopsys
• Exemple 1- un seul thread
start
resume
start
ROOT
inactive
P1
S
P1
T
WATCH
DOG
P2
F
S
O
0
P2
PAUSE
O
PAUSE
T
Le compilateur Synopsys
• Exemple 1- Greedy scheduling
start
resume
inactive
P1
S
P1
T
P2
O
0
P2
state_next=inactive ;
if(start){
state_next=P1 ;
}
if(resume){
if(state!=0){
if(!S){
switch(state){
case P1:
O=1 ;
state_next = P2 ;
break ;
case P2:
break ;
}}}}
Le compilateur Synopsys
• Exemple 2- parallélisme, 3 threads
start
RETURN
O3
O1
S
FORK
S
F
0
0
O1
PARALLEL
S
P2
O2
P1
T
S
F
O2
0
O3
PAUSE
1
PAUSE
Le compilateur Synopsys
• Exemple 2- Ordonnancement Greedy
après édition de liens
O1
S
S
F
0
0
P2
O2
P1
0
O3
1
Le compilateur Synopsys
• Exemple 3 (réincarnation)
module ex3:
output O ;
loop
trap T in
pause ;
exit T
||
loop
emit O ;
pause
end loop
end trap
end loop
end module
RETURN
start
PARALLEL
FORK
T
O
PAUSE
PAUSE
Le compilateur Synopsys
• Exemple 3 (réincarnation)
RETURN
start
PARALLEL
FORK
P1
2
O
P2
T
O
PAUSE
2
1
PAUSE
Le compilateur Synopsys
• Exemple 3 (réincarnation)
P1
2
O
P2
P1
2
O
2
P2
1
O
P1
2
P2
1
Le compilateur Synopsys
• Encodage performant (état et contrôle)
• Structure figée, optimisations difficiles
Nouvelle technique
• Nouveau format intermédiaire GRC
– proche du circuit pour la modélisation du flot
de contrôle (sémantique constructive)
– optimisations a ce niveau (similaire au
compilateur CNET)
– proche du compilateur Synopsys pour la
représentation de l’état
• Traduction GRC-C mixte: planification
statique/simulation constructive
Le format GRC = LC simplifié
• Représentation de l’état
– arbre de sélection LC, séparé du flot de
contrôle
• Flot de contrôle
– expansion des nœuds LC en opérations
instantanées (fork, test, switch, synchronize,
appel d’action)
– sémantique constructive
– réincarnation
Le format GRC
• Arbre de sélection
#
1
0
boot
start
ROOT
2 #
3
4
WATCH
DOG
F
PAUSE
O
S
PAUSE
T
Le format GRC
• Flot de contrôle
#
1
0
boot
2 #
3
exit 1
enter 2
4
enter 3
start
ROOT
1
exit 2
T
#(0)
2
S
4
F
exit 0
exit 4
WATCH
DOG
#(2)
S
F
3
exit 3
emit O
enter 4
PAUSE
O
PAUSE
T
Génération de code
• Encodage d’état – hiérarchique, bitwise
#
0
1
boot
#
0
1
bit 0: vie du programme (0=>programme terminé)
bit 1: choix entre premier instant(0) et les autres(1),
si bit0=1
bit 2: choix entre les instructions pause, si bit1=1
state=110 => programme actif,
pas premier instant,
première pause active
state=100 => état initial,
premier instant d’exécution
Génération de code
• Encodage d’état (exemple fictif)
bit 0: vie du programme (0=>programme terminé)
bit 1: choix entre premier instant(0) et les autres(1),
si bit0=1
bit 2 et 3: choix entre les instructions pause, si bit1=1
#
0
1
boot
00
#
01
10
state=1101 => programme actif,
pas premier instant,
deuxième pause active
state=1000 => état initial,
premier instant d’exécution
Génération de code
• Encodage d’état, conséquences
exit 1
enter 2
state=110
enter 3
0
1
exit 2
T
#(0)
2
S
4
F
exit 0
bit1
1
exit 4
T
state=000
S
1
F
bit2
#(2)
0
3
exit 3
emit O
enter 4
emit O
state=111
Génération de code
• Ordonnancement
if(state&010b) {
bool aux=false ;
if(S) {
aux=true ;
} else {
if(state&001b) {
aux=true ;
} else {
O_emit() ;
state=111b ;
}
}
if(aux) {
state=000b ;
}
} else {
state=110b ;
}
state=110
0
bit1
1
T
state=000
S
1
F
bit2
0
emit O
state=111
Second exemple:
start
#
1
RETURN
0
boot
O3
FORK
2 ||
O1
3
PARALLEL
S
4
T
S
F
O2
PAUSE
PAUSE
#
Second exemple:
1
0
boot
2 ||
3
4
start
RETURN
O3
FORK
O1
T
S
PARALLEL
S
F
O2
PAUSE
PAUSE
Le format GRC
• Sémantique des nœuds: circuits constructifs
F
GO
F
GO
present(S)
S
S
T
T
• Traitement de programmes cycliques causaux
par simulation constructive du circuit
correspondant au cycle
Le format GRC
• Types de nœuds:
Tick
Sync
K0[0
…
]
Ki[0]
INACTIVE[0]
…
K0[n]
Call
GO
||(n)
…
Ki[n]
INACTIVE[n]
routine
F
Test
GO
SIG
expr
T
Switch
n1
n2
#(n) …
nk
…
K0
Ki
Le format GRC
• Optimisations – effacement d’arcs et de
nœuds:
– constructive sweep
– analyse statique sur la representation de l’etat
• Encodage performant d’état et du contrôle
Implémentation:
• Déjà fait:
– génération et optimisations de spécifications GRC
– générateur de code C pour spécifications acycliques
très simples
• En chantier:
– Nouvelles optimisations du format intermédiaire
– Un meilleur générateur de code en cas acyclique
– L’extension par simulation constructive aux
spécifications cycliques