Inleiding De taal Implementatie Benchmarks Conclusie
CCHR: De snelste CHR implementatie
Pieter Wuille
Promotor:
Prof. Dr. Bart Demoen Begeleider:
Dr. ir. Tom Schrijvers
29 mei 2007
1 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht
1 Inleiding
2 De taal
3 Implementatie
4 Benchmarks
5 Conclusie
Inleiding De taal Implementatie Benchmarks Conclusie
Wat is CHR?
Voorbeelden Doelstellingen
Overzicht
1 Inleiding Wat is CHR?
Voorbeelden Doelstellingen
2 De taal
3 Implementatie
4 Benchmarks
5 Conclusie
3 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Wat is CHR?
Voorbeelden Doelstellingen
CHR
Wat is CHR?
Een hoog-niveau declaratieve taaluitbreiding (van gasttaal) Regelgebaseerde omzetting van CHR constraints naar
Andere CHR constraints
Built-in constraints (door gasttaal aangeboden) In feite multiset herschrijfregels
Inleiding De taal Implementatie Benchmarks Conclusie
Wat is CHR?
Voorbeelden Doelstellingen
CHR syntax
Example
Grootst gemene deler in CHR(Prolog)
:- chr_constraint prime(+int), upto(+natural).
upto(X) <=> X<2 | true.
upto(X) ==> X>1 | Y is X-1, upto(Y), prime(X).
prime(X) \ prime(Y) <=> Z is Y mod X, Z==0 | true.
CHR Syntax
Regels voor herschrijven CHR constraint store Simplification, propagation en simpagation regels
Simplification: Rem <=> Guard | Body Propagation: Kept ==> Guard | Body Simpagation: Kept \Rem <=> Guard | Body
5 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Wat is CHR?
Voorbeelden Doelstellingen
Doelstellingen CCHR
Doelstellingen
Een zo effici¨ent mogelijke CHR implementatie schrijven C als gasttaal gebruiken
Mogelijkheden C
Veel vrijheid datastructuren Directe geheugentoegang
Bestaande optimaliserende compilers Bindings in veel andere talen
Inleiding De taal Implementatie Benchmarks Conclusie
Syntax Voorbeelden
Overzicht
1 Inleiding
2 De taal Syntax Voorbeelden
3 Implementatie
4 Benchmarks
5 Conclusie
7 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Syntax Voorbeelden
CCHR: De taal
Syntax
Binnen een cchr-blok in C code
Constraint declaraties (argumenten: meeste C types) Regels gelijkaardig aan CHR syntax
Arbitraire C expressies en statements in guard en body Lokale variabelen in guard en body
Logische variabelen zijn mogelijk
Inleiding De taal Implementatie Benchmarks Conclusie
Syntax Voorbeelden
CCHR: Voorbeeld 1
Example (Voorbeeld 1)
#include <stdio.h>
#include <stdlib.h>
#include "fib_cchr.h"/* header gegenereerd door CCHR compiler */
cchr{
constraintfib(int,long),upto(int);
begin@upto(_)==>fib(0,1L),fib(1,1L);
calc@ upto(Max),fib(N2,M2)\fib(N1,M1)<=> alt(N2==N1+1,N2-1==N1), N2<Max| fib(N2+1, M1+M2);
}
int main(int argc, char **argv) { cchr_runtime_init();
cchr_add_upto_1(90);/* voeg upto(90) toe */
cchr_consloop(j,fib_2,{
printf("fib(%i,%li)\n",cchr_consarg(j,fib_2,1),(long)cchr_consarg(j,fib_2,2));
});
cchr_runtime_free();
return 0;
}
9 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Syntax Voorbeelden
CCHR: Voorbeeld 2
Example (Voorbeeld 2)
/* definieer log_int_t als een logische variabele van int’s */
logical_header(int,int,log_int_t)
/* cchr blok */
cchr {
constraint fib(int,log_int_t)
option(destr,{log_int_t_destruct($2);}) option(init,{log_int_t_copy($2);});
dup @ fib(N,M1) \ fib(N,M2) <=> { log_int_t_seteq(M1,M2); };
f01 @ fib(N,M) ==> N<2 | { log_int_t_setval(M,1); };
fn @ fib(N,M) ==> N>1 |
log_int_t M1=log_int_t_create(), log_int_t M2=log_int_t_create(), fib(N-2,M1), fib(N-1,M2),
{ log_int_t_setval(M,log_int_t_getval(M1)+log_int_t_getval(M2)); }, { log_int_t_destruct(M1); log_int_t_destruct(M2); };
}
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Overzicht
1 Inleiding
2 De taal
3 Implementatie Overzicht CCHR Compiler Gegenereerde code Overige code
4 Benchmarks
5 Conclusie
11 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Opbouw CCHR
Compilatieproces
CCHR code wordt door CCHR compiler doorlopen
C code kopi¨eren, CCHR code vertalen naar macro’s
Gegenereerde code compileren (mbv. CSM definities)
Extra libs (bv. code voor hashtable) compileren Samen linken tot executable Het resultaat is een platform-specifiek, effici¨ent programma.
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
CCHR Compiler
13 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Lexer en Parser
Lexer
Geschreven mbv. Flex, die lexer in C genereert.
Splitst invoer in operatoren, haakjes, symbolen.
Deze ‘tokens’ worden aan parser gegeven.
Parser
Geschreven mbv. Bison, die parser in C genereert.
Herkent regels, code-blokken, argumenten, constraints, . . . Bouwt Abstract Syntax Tree (AST)
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Analyse
Analyse
Tijdens de analyse wordt de AST omgezet in een tussenvorm (semantic tree, ST)
Alle types, variabelen, constraints, rules, occurrences worden objecten met onderlinge verwijzingen ipv. strings.
Alle regels zijn omgezet naar Head Normal Form (HNF).
Onderlinge afhankelijkheden tussen variabelen en occurrences worden bepaald.
15 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Join ordering en code generatie
Join ordering
Voor elke constraint occurrence moet iteratievolgorde en -methode bepaald worden voor elke partner constraint.
Alle mogelijke volgordes afgaan.
Gewicht toekennen aan elke volgorde.
Volgorde met laagste gewicht kiezen.
Guard met iterator combineren (index).
Code generatie
C macro’s en een C header genereren voor elke:
constraint, constraint occurrence, rule index, propagation geschiedenis, . . .
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Voorbeeld - CCHR code
Example
constraint fib(int,long),upto(int);
begin @ upto(_) ==> upto(0,1L), upto(1,1L);
calc @ upto(Max), fib(N2,M2) \ fib(N1,M1)
<=> alt(N2==N1+1,N2-1==N1), N2<Max
| fib(N2+1, M1+M2);
17 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Voorbeeld - C Macro’s
Example (generated code)
#define CODELIST_fib_2_calc_R1 \
CSM_IMMLOCAL(int,N1,CSM_ARG(fib_2,arg1)) \ CSM_IMMLOCAL(long,M1,CSM_ARG(fib_2,arg2)) \ CSM_DEFIDXVAR(fib_2,idx1,K2) \
CSM_SETIDXVAR(fib_2,idx1,K2,arg1,CSM_LOCAL(N1) + 1) \ CSM_IDXLOOP(fib_2,idx1,K2, \
CSM_IF(CSM_DIFFSELF(K2), \
CSM_IMMLOCAL(int,N2,CSM_LARG(fib_2,K2,arg1)) \ CSM_IMMLOCAL(long,M2,CSM_LARG(fib_2,K2,arg2)) \ CSM_LOOP(upto_1,K1, \
CSM_IMMLOCAL(int,Max,CSM_LARG(upto_1,K1,arg1)) \ CSM_IF(CSM_LOCAL(N2) < CSM_LOCAL(Max), \
CSM_KILLSELF(fib_2) \
CSM_ADD(fib_2,CSM_LOCAL(N2)+1,CSM_LOCAL(M1)+CSM_LOCAL(M2)) \ CSM_END \
) \ ) \ ) \ )
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
CSM definities
CSM definities
Schermen implementatie-details af van codegenerator.
Datastructuren kunnen gewijzigd worden zonder codegenerator aan te passen.
Definieert de CSM START macro.
Gedefinieerd in bestand cchr csm.h, dat in gegenereerde header ingeladen wordt.
19 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Hashtables
Hashtable
Datastructuur om in O(1) tijd elementen op te zoeken.
Zelf ge¨ımplementeerd Cuckoo-hashing algoritme.
Gebruikt om indexen en propagation geschiedenis in bij te houden.
Hashfunctie
Hashtable vereist grillige functie om elementen op getallen af te beelden.
Het public-domain lookup3 algoritme gebruikt.
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht CCHR Compiler Gegenereerde code Overige code
Logische variabelen
Logische variabelen
Variabelen die een waarde kunnen hebben of niet Waarover onderlinge gelijkheden bekend kunnen zijn Ge¨ımplementeerd met een C implementatie van het Union-Find algoritme
Ook buiten CCHR bruikbaar
21 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Fibonacci
Kleiner-dan of gelijk-aan Grootste gemene deler Vergelijking
Overzicht
1 Inleiding
2 De taal
3 Implementatie
4 Benchmarks Fibonacci
Kleiner-dan of gelijk-aan Grootste gemene deler Vergelijking
5 Conclusie
Inleiding De taal Implementatie Benchmarks Conclusie
Fibonacci
Kleiner-dan of gelijk-aan Grootste gemene deler Vergelijking
Benchmark: Fibonacci
1e-06 1e-05 1e-04 0.001 0.01 0.1 1 10
1 10 100 1000 10000 100000 1e+06
time
problem size Benchmark fib
swi jchr cchr c
23 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Fibonacci
Kleiner-dan of gelijk-aan Grootste gemene deler Vergelijking
Benchmark: Kleiner-dan of gelijk-aan
1e-06 1e-05 1e-04 0.001 0.01 0.1 1 10
1 10 100 1000
time
problem size Benchmark leq
swi jchr cchr c
Inleiding De taal Implementatie Benchmarks Conclusie
Fibonacci
Kleiner-dan of gelijk-aan Grootste gemene deler Vergelijking
Benchmark: Grootste gemene deler
1e-06 1e-05 1e-04 0.001 0.01 0.1 1 10 100
1 10 100 1000 10000 100000 1e+06 1e+07 1e+08
time
problem size Benchmark gcd
swi cchr c
25 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Fibonacci
Kleiner-dan of gelijk-aan Grootste gemene deler Vergelijking
Vergelijking benchmarks
SWI JCHR CCHR C
gcd 22000 - 3.4 1
fib 21000 940 8.5 1
primes 310 490 6.9 1
tak 210 110 4.3 1
leq 1100 440 9.8 1
ram 4700 11000 120.0 1
Inleiding De taal Implementatie Benchmarks Conclusie
Overzicht
1 Inleiding
2 De taal
3 Implementatie
4 Benchmarks
5 Conclusie
27 / 29
Inleiding De taal Implementatie Benchmarks Conclusie
Conclusie
Conclusie
Met deze thesis is aangetoond dat:
Een CHR implementatie in/voor C mogelijk is en dat het een snelheidswinst oplevert
Inleiding De taal Implementatie Benchmarks Conclusie
Einde
Einde
29 / 29