Mellanliggande kvantrepresentation
Quantum Intermediate Representation (QIR) är en mellanliggande representation som fungerar som ett gemensamt gränssnitt mellan kvantprogrammeringsspråk/ramverk och målbaserade kvantberäkningsplattformar. QIR anger en uppsättning regler för att representera kvantprogram med hjälp av ett språk- och maskinvaruagnostiskt format i LLVM IR. QIR är ett projekt som utvecklats av QIR Alliance där Microsoft är en av dess medlemmar.
Vad är en mellanliggande representation?
Ett vanligt mönster i klassiska kompilatorer är att börja med att kompilera källspråket till en mellanliggande representation. En mellanliggande representation är – som namnet anger – ett mellanliggande steg i konverteringen av instruktioner från källkod till datorspråk.
En mellanliggande representation fungerar som en abstrakt representation av ett program. Alla program, oavsett vilket språk de skrivs i, översätts till denna mellanliggande representation av en så kallad frontend-kompilator, medan en serverdelskomponent ansvarar för att översätta den mellanliggande representationen till en datorrepresentation. Den mellanliggande representationen gör det därför möjligt att frikoppla källspråk från maskinvaruplattformar och gör det möjligt att bygga en kompilator på ett modulärt sätt, där varje nytt språk bara kräver att en ny klientdel stöds på alla plattformar som en serverdel är tillgänglig för.
Den mellanliggande representationen är vanligtvis utformad för att tillåta att många olika källspråk representeras. På den här mellannivå är det dessutom möjligt att utföra viss optimering och omorganisering av kretsar som gör den slutliga implementeringen mer effektiv. När den slutliga target körningsplattformen är känd kan den mellanliggande representationen kompileras till den faktiska körbara koden.
Med den här metoden kan många källspråk dela en gemensam uppsättning optimerare och körbara generatorer. Det gör det också enkelt att kompilera ett enda källspråk för många olika targets. Den mellanliggande representationen ger en gemensam plattform som kan delas mellan många källor och targets möjliggör en hel del återanvändning i kompilatormaskiner.
Vad är Quantum Intermediate Representation?
QIR är en mellanliggande representation för kvantprogram som utvecklats av QIR Alliance, som Microsoft tillhör. Det ger ett gemensamt gränssnitt som stöder många språk och target plattformar för kvantberäkning. Du kan se QIR som ett universellt mellanlagerspråk som möjliggör kommunikation mellan högnivåspråk och datorer. QIR Q# kompileras till QIR men är inte specifikt för Q#: alla kvantprogrammeringsramverk kan använda QIR för att representera ett kvantprogram. Det är maskinvaruagnostiskt, vilket innebär att det inte anger en kvantinstruktion eller grinduppsättning, vilket lämnar den till databehandlingsmiljön target .
QIR baseras på den populära klassiska LLVM-kompilatorn med öppen källkod. LLVM är en samling modulära och återanvändbara kompilator- och verktygskedjatekniker som har anpassats av en mängd olika språk. QIR anger en uppsättning regler för att representera kvantkonstruktioner i LLVM, men det kräver inga tillägg eller ändringar av LLVM.
Det faktum att LLVM är den underliggande verktygskedjan innebär att QIR naturligt kan bearbeta både klassisk och kvantlogik. Den här funktionen är viktig för kvantklassiska hybridalgoritmer, som har blivit allt viktigare för tillämpningar av kvantberäkning. Dessutom kan du använda kompilerings- och optimeringsverktyg från den klassiska databehandlingsindustrin och därmed minska kostnaderna för att skriva översättningar.
Många ledande kvantberäkningsindustrier har redan antagit QIR. Till exempel skapar NVIDIA, Oak Ridge National Laboratory, Quantinuum, Quantum Circuits Inc., och Rigetti Computing verktygskedjor som utnyttjar QIR.
Mer information finns i QIR-specifikationen. Om du är intresserad av kompilatorverktyg och projekt som använder QIR kan du ta en titt på dessa QIR-lagringsplatser.
Vad är QIR Alliance?
QIR Alliance är en gemensam insats för att utveckla en framåtblickande kvantintermediär representation med målet att möjliggöra fullständig samverkan inom kvantekosystemet, minska utvecklingsinsatserna från alla parter och tillhandahålla en representation som är lämplig för nuvarande och framtida heterogena kvantprocessorer.
Kvant-SDK:er och -språk visas och utvecklas i snabb takt, tillsammans med nya kvantprocessorer med unika och distinkta funktioner från varandra. För att tillhandahålla samverkan mellan nya språk och nya maskinvarufunktioner är det absolut nödvändigt att ekosystemet utvecklar och delar en mellanliggande representation som fungerar med nuvarande och framtida kvantmaskinvara.
Med sitt kollektiva arbete och partnerskap strävar QIR Alliance efter att:
- Minska den nödvändiga utvecklingsinsatsen för alla parter genom att främja samverkan mellan olika ramverk och språk.
- Aktivera utveckling av delade bibliotek både för utveckling av kvantprogram och för utveckling av kvantkompilatorer.
- Bygg vidare på den senaste kompilatortekniken och utnyttja befintliga verktyg, bibliotek och lärdomar från högpresterande databehandling.
- Tillåt inkrementell och progressiv utveckling i hur klassiska beräkningar och kvantberäkningar kan interagera på maskinvarunivå.
- Ge flexibiliteten att enkelt ansluta nya tekniker på ett sätt som tillåter experimentering med distinkta och differentierade maskinvarufunktioner.
QIR Alliance är en del av Linux Foundations Joint Development Foundation-arbete med öppna standarder. Grundande medlemmar inkluderar Microsoft, liksom Quantinuum (tidigare Honeywell), Oak Ridge National Laboratory, Quantum Circuits Inc. och Rigetti Computing.
Hur ser det Quantum Intermediate Representation ut?
Eftersom QIR baseras på LLVM ser QIR ut som LLVM.
Tänk dig till exempel följande Q# kod för att generera ett Bell-par:
operation CreateBellPair(q1 : Qubit, q2 : Qubit) : Unit {
H(q1);
CNOT(q1, q2);
}
När det kompileras till QIR blir detta:
define void @CreateBellPair__body(%Qubit* %q1, %Qubit* %q2) {
entry:
call void @__quantum__qis__h(%Qubit* %q1)
call void @__quantum__qis__cnot(%Qubit* %q1, %Qubit* %q2)
ret void
}
I det här kodfragmentet kan du se några QIR-funktioner:
- Åtgärder i Q# (eller något annat kvantprogrammeringsspråk) representeras av LLVM-funktioner.
- Qubits representeras som pekare till en namngiven ogenomskinlig strukturtyp med namnet
%Qubit
.
QIR för CreateBellPair
åtgärden är mycket enkel, men QIR ärver alla funktioner i LLVM för att uttrycka loopar, villkor och annat komplext kontrollflöde. QIR ärver också LLVM:s förmåga att uttrycka godtycklig klassisk beräkning.
Mer information finns i Microsofts utvecklarsession från 2021 års Q2B-händelse.
Varför är Quantum Intermediate Representation viktigt?
QIR är ett viktigt verktyg när du kör kvantalgoritmer på verklig maskinvara. Men mellanliggande representationer kan spela en viktig roll även om du bara vill utveckla algoritmer på en mer teoretisk nivå.
Ett program som aktiveras av QIR är till exempel att använda Clang-kompilatorn, en C-språkklientdel för LLVM, för att kompilera QIR till körbar datorkod för en klassisk target. Detta ger en enkel väg till att skapa en simulator i C eller C++ genom att implementera kvantinstruktionerna, vilket kan förenkla skapandet av kvantsimulatorer.
Dessutom kan du använda den mellanliggande representationen för att generera kod som senare tillhandahålls som indata till en kvantsimulator – i stället för en riktig enhet – som potentiellt skulle kunna använda ett annat språk än källkoden. På så sätt kan du enkelt jämföra och jämföra olika språk eller simulatorer med hjälp av ett gemensamt ramverk.
När det gäller kodoptimering finns det optimeringssteg som kan utföras på mellannivå som kan göra den övergripande algoritmimplementeringen mer effektiv. Genom att undersöka den här optimeringen av din indatakod kan du få en bättre förståelse för var du kan göra algoritmer mer effektiva och hur du kan förbättra kvantprogrammeringsspråken.
Ett annat program är att använda llvm-standardinfrastrukturen "pass" för att skapa kvantkodsoptimerare som körs på QIR. Den språk- och maskinvaruoberoende metoden för QIR gör det möjligt att återanvända dessa optimerare för olika beräkningsspråk och beräkningsplattformar utan att göra något.