Specialisering af køre-tid algoritmer - Run-time algorithm specialisation

Inden for datalogi er specialisering af runtime-algoritmer en metode til at skabe effektive algoritmer til dyre beregningsopgaver af visse slags. Metodikken har sin oprindelse inden for beviser af automatiseret teorem og mere specifikt i Vampire teorem prover- projektet.

Idéen er inspireret af brugen af delvis evaluering i optimering af programoversættelse. Mange kerneoperationer i teorem provers udviser følgende mønster. Antag, at vi er nødt til at udføre en eller anden algoritme i en situation, hvor en værdi af er fastsat for potentielt mange forskellige værdier af . For at gøre dette effektivt kan vi forsøge at finde en specialisering for hver fast , dvs. en sådan algoritme , at eksekvering svarer til eksekvering .

Den specialiserede algoritme kan være mere effektiv end den generiske, da den kan udnytte nogle særlige egenskaber ved den faste værdi . Kan typisk undgå nogle operationer, der skulle udføres, hvis de vides at være overflødige for denne bestemte parameter . Især kan vi ofte identificere nogle test, der er sandt eller usant for , rulleslynge og rekursion osv.

Forskel fra delvis evaluering

Den vigtigste forskel mellem runtime-specialisering og delvis evaluering er, at værdierne, som er specialiseret i, ikke kendes statisk, så specialiseringen finder sted på run-time .

Der er også en vigtig teknisk forskel. Delvis evaluering anvendes til algoritmer, der eksplicit repræsenteres som koder i et hvilket som helst programmeringssprog. På kørsel har vi ikke brug for nogen konkret repræsentation af . Vi skal kun forestille os, når vi programmerer specialiseringsproceduren. Alt, hvad vi har brug for, er en konkret repræsentation af den specialiserede version . Dette betyder også, at vi ikke kan bruge universelle metoder til specialisering af algoritmer, hvilket normalt er tilfældet med delvis evaluering. I stedet skal vi programmere en specialiseringsprocedure for hver enkelt algoritme . En vigtig fordel ved at gøre det er, at vi kan bruge nogle kraftige ad hoc- tricks, der udnytter særegenheder og repræsentation af og , som er uden for rækkevidde af enhver universal specialiseringsmetode.

Specialisering med samling

Den specialiserede algoritme skal repræsenteres i en form, der kan fortolkes. I mange situationer, normalt når skal beregnes på mange værdier i træk, kan vi skrive som en kode for en speciel abstrakt maskine , og vi siger ofte, at det er samlet . Derefter kan selve koden optimeres yderligere ved at besvare konservering af transformationer, der kun er afhængige af semantikken i instruktioner fra den abstrakte maskine.

Instruktioner på den abstrakte maskine kan normalt repræsenteres som poster. Et felt i en sådan post gemmer et heltalskode, der identificerer instruktionstypen, andre felter kan bruges til at gemme yderligere parametre til instruktionen, for eksempel en markør til en anden instruktion, der repræsenterer en label, hvis instruktionens semantik kræver et spring. Alle instruktioner for en kode kan gemmes i en matrix, eller en liste eller et træ.

Fortolkningen udføres ved at hente instruktioner i en eller anden rækkefølge, identificere deres type og udføre handlingerne, der er knyttet til denne type. I C eller C ++ kan vi bruge en switch- sætning til at knytte nogle handlinger til forskellige instruktionskoder. Moderne kompilatorer udarbejder normalt en switch- sætning med heltaletiketter fra et snævert område temmelig effektivt ved at gemme adressen på sætningen svarende til en værdi i -th cellen i en speciel matrix. Man kan udnytte dette ved at tage værdier til instruktions tags fra et lille interval af heltal.

Specialisering af data og algoritmer

Der er situationer, hvor mange tilfælde af er beregnet til langvarig opbevaring, og opkaldene opstår med forskellige i en uforudsigelig rækkefølge. For eksempel er vi muligvis nødt til at kontrollere først, derefter , derefter , og så videre. Under sådanne omstændigheder er specialisering i fuld skala med kompilering muligvis ikke egnet på grund af overdreven hukommelsesforbrug. Vi kan dog undertiden finde en kompakt specialiseret repræsentation til enhver , der kan gemmes med eller i stedet for . Vi definerer også en variant, der fungerer på denne repræsentation, og ethvert opkald til erstattes af , beregnet til at udføre det samme job hurtigere.

Se også

Referencer

Yderligere læsning

  • A. Riazanov og A. Voronkov, "Effektiv kontrol af begrænsning af ordrerelaterede ordrer", Proc. IJCAR 2004, forelæsningsnotater i kunstig intelligens 3097, 2004 ( kompakt, men selvstændig illustration af metoden )
  • A. Riazanov og A. Voronkov, Efficient Instance Retrieval with Standard and Relational Path Indexing , Information and Computation, 199 (1-2), 2005 ( indeholder en anden illustration af metoden )
  • A. Riazanov, "Implementing a Efficient Theorem Prover" , ph.d.-afhandling, University of Manchester, 2003 ( indeholder den mest omfattende beskrivelse af metoden og mange eksempler )