Algemeen Implementatie Resultaten
CCHR: De snelste CHR implementatie
Pieter Wuille
Promotor:
Prof. Dr. Bart Demoen Begeleider:
Dr. ir. Tom Schrijvers
29 maart 2007
Overzicht
1 Algemeen
Waarom CCHR Structuur
2 Implementatie Mogelijkheden Structuur
Logische variabelen Hashtables
3 Resultaten Performantie Voorbeelden Wat nog rest
Algemeen Implementatie Resultaten
Waarom CCHR Structuur
Overzicht
1 Algemeen
Waarom CCHR Structuur
2 Implementatie Mogelijkheden Structuur
Logische variabelen Hashtables
3 Resultaten Performantie Voorbeelden Wat nog rest
Waarom CHR in C?
Waarom CHR in C?
CHR kunnen gebruiken in pure C programma’s Een poging tot CHR heel snel maken:
Vrijheid datastructuren
Optimalisaties C compiler benutten
Algemeen Implementatie Resultaten
Waarom CCHR Structuur
Opbouw CCHR
De verschillende stappen bij het gebruik van CCHR zijn:
CCHR code
CCHR Compiler C macro’s
C Preprocessor C code
C Compiler Executable
CCHR code
Gewone C broncode
Met “cchr { . . . }” blokken in Deze blokken worden vervangen door C macro’s
Overzicht
1 Algemeen
Waarom CCHR Structuur
2 Implementatie Mogelijkheden Structuur
Logische variabelen Hashtables
3 Resultaten Performantie Voorbeelden Wat nog rest
Algemeen Implementatie Resultaten
Mogelijkheden Structuur Logische variabelen Hashtables
Mogelijkheden
CHR Constraints
CHR Constraints zijn ge¨ımplementeerd:
Willekeurige ariteit
Alle C datatypes (behalve arrays) als argumenten
Example
constraint init(int),fib(int,bignum_t) destr(destruct_bignum(&$2));
Mogelijkheden
CHR Rules
CHR Rules zijn ge¨ımplementeerd:
Propagation (K , . . .==>. . .) Simplification (R, . . .<=>. . .) Simpagation (K , . . .\ R, . . .<=>. . .)
Example
begin @ init(_) ==> fib(0,1), fib(1,1);
triv @ gcd(0) <=> true;
dec @ gcd(N) \ gcd(M) <=> M>=N | gcd(M-N);
Algemeen Implementatie Resultaten
Mogelijkheden Structuur Logische variabelen Hashtables
Mogelijkheden
Guards en Bodys
De volgende zaken zijn mogelijk als guard en body:
Voorwaardelijke expressies (enkel guard) Variabele declaraties (en initialisaties) Willekeurige C code (tussen accolades) Toe te voegen CHR contraints (enkel body)
Structuur
Source
CCHR
main lexer & parser
analyse
code generatie
C code
Algemeen Implementatie Resultaten
Mogelijkheden Structuur Logische variabelen Hashtables
Structuur - Main, Lexer, Parser
Source
CCHR main lexer & parser
analyse code generatie C code
de main module
Bevat de main() C routine Overloopt alle opgegeven sourcefiles
Roept andere modules aan voor cchr-blokken
Lexer en Parser
Geschreven in Flex en Bison resp.
Herkennen CCHR tokens en grammatica
Enkel voor CCHR blokken
Structuur - Analyse
Source
CCHR main lexer & parser
analyse code generatie C code
de analyser
Analyseert output van de parser (abstract syntax tree)
Genereert nieuwe data structuur met expressions, variabelen, constraints, regels, . . . Doet conversie naar Head Normal Form
Optimaliseert (iteratie volgorde, propagation history, indexen, . . . )
Algemeen Implementatie Resultaten
Mogelijkheden Structuur Logische variabelen Hashtables
Structuur - Code generatie
Source
CCHR main lexer & parser
analyse code generatie C code
de code-generator
Gebruikt de gegevens gegenereerd door analyser Genereert een aantal macro’s voor elke constraint/regel Voor elke constraint occurrence een macro met code
Logische variabelen
Wat?
Variabelen die niet noodzakelijk een waarde hebben Eventueel ’equalities’ tussen bekend
vgl. met Prolog
Implementatie
Gebruikt ’Union-Find’ algoritme voor efficientie Aan te roepen met een C macro
Voorlopig los van CCHR zelf
Algemeen Implementatie Resultaten
Mogelijkheden Structuur Logische variabelen Hashtables
Hashtables
Waarom?
Versnellen van opzoekingen:
Propagation-history checks
Iteratie over constraints met bepaald argument Iteratie over logische variabelen en reactivatie ervan
Implementatie
Alweer gedefinieerd door C macros Als hash-algoritme: lookup3
Als table-algoritme: cuckoo-hashing
Hashtables - Lookup3
Lookup3
Public-domain algoritme
Willekeurige bytesequenties als key
Heel uniform, gecontroleerd voor veel patronen Waarschijnlijk overkill voor heel simpele keys
Algemeen Implementatie Resultaten
Mogelijkheden Structuur Logische variabelen Hashtables
Hashtables - Cuckoo Hashing
Cuckoo Hashing
2 aparte hashtables, met onafhankelijke hashfunctie Indien een plaats bezet in table 1, overschrijven en oud element in table 2 plaatsen. Indien dat bezet is . . . Vrij simpel te implementeren
Geen aparte list per plaats nodig, en geen fragmentatie Enkel lastig om over te itereren
Hashtables - Gebruik
Wanneer?
Propagation history wordt erin bijgehouden Gelijkheden in guards worden hashtable indexen
Example
dec @ fib(N2,F1) \ fib(N1,F2) <=>
alt(N1+1==N2,N1==N2-1) | fib(N2+1,F1+F2);
Algemeen Implementatie Resultaten
Performantie Voorbeelden Wat nog rest
Overzicht
1 Algemeen
Waarom CCHR Structuur
2 Implementatie Mogelijkheden Structuur
Logische variabelen Hashtables
3 Resultaten Performantie Voorbeelden Wat nog rest
Resultaten
resultaten
test swi-prolog jchr cchr cchr(noidx) C
gcd 37.1s - 0.085s 0.085s 0.019s
fib 708s 5.0s 0.024s 1.3s 0.003s
primes 4.12s 4.3s 0.091s 0.091s 0.010s
tak 6.19s 0.57s 0.048s 21s 0.007s
ram 0.63s 0.62s 0.016s 0.0057s 0.0001s merge 0.33s 1.6s 0.036s 0.019s 0.0005s
leq 947s 2.8s 0.0008s 1.3s 0.0008s
avg 650 95 1 14 0.075
Algemeen Implementatie Resultaten
Performantie Voorbeelden Wat nog rest
Voorbeeld - CCHR code
Example
constraint fib(int,uint64_t);
begin @ init(_) ==> fib(0,1ULL), fib(1,1ULL);
calc @ init(Max), fib(N2,M2) \ fib(N1,M1) <=>
alt(N2==N1+1,N2-1==N1), N2<Max | fib(N2+1, M1+M2);
Voorbeeld - C Macros
Example (generated code)
#define CODELIST_fib_2_calc_R1 \
CSM_IMMLOCAL(int,N1,CSM_ARG(fib_2,arg1)) \ CSM_IMMLOCAL(uint64_t,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(uint64_t,M2,CSM_LARG(fib_2,K2,arg2)) \ CSM_LOOP(init_1,K1, \
CSM_IMMLOCAL(int,Max,CSM_LARG(init_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 \
) \ ) \ ) \ )
Algemeen Implementatie Resultaten
Performantie Voorbeelden Wat nog rest
Wat nog rest
Wat nog rest
Integratie logische variabelen met CCHR (en indexen erop) Nog enkele foutjes oplossen
Documentatie schrijven Thesistekst schrijven
Nog vragen?