Řešení potíží s integrovanými hybridními řešeními

Poznámka

Tento obsah se vztahuje pouze na sadu Classic QDK.

Vývoj a spouštění integrovaných hybridních algoritmů na nejnovějším podporovaném hardwaru je nová a rychle se vyvíjející oblast. Tento článek popisuje nástroje a metody, které jsou aktuálně k dispozici, spolu se známými problémy, a aktualizuje se, protože jsou podporovány nové funkce.

Omezení a omezení funkcí

Následující tabulka uvádí aktuálně známá omezení a omezení integrované sady hybridních funkcí. Povědomí o těchto omezeních vám může pomoct předcházet chybám při zkoumání integrovaných hybridních programů. Tato tabulka se aktualizuje, jakmile se funkce rozšíří.

Položka Poznámky
Podporované knihovny Od této verze nepodporují integrované hybridní programy všechny knihovny v QDK.
Upozornění kompilátoru Ve výchozím nastavení targetse chyby kompilátoru specifické pro -převedou na upozornění. Před spuštěním na kvantovém hardwaru nezapomeňte ověřit kód na simulátoru, emulátoru nebo validátoru poskytnutém targetposkytovatelem hardwaru.
Složené datové typy Integrované hybridní programy v současné době nepodporují použití složených datových typů, jako jsou typy struktur, řazené kolekce členů a sekvenční typy, včetně polí. Toto omezení také brání použití takových datových struktur pro volatelné hodnoty. Integrované programy navíc nemůžou používat podprogramy jako hodnoty první třídy a použití typů funkcí je omezeno na globálně deklarované funkce LLVM , které mohou být volány jako součást provádění programu.
Nevázané smyčky nebo rekurze Nevázané smyčky a přímé nebo nepřímé rekurze funkcí jsou pro tuto verzi mimo rozsah.
Dynamické přidělování qubitů a přístup Funkce modulu runtime pro přidělování a vydávání qubitů nejsou k dispozici a chybějící podpora místních proměnných a složených datových typů brání aliasování qubitů.
Částečné aplikace Použití částečné aplikace k definování volatelné viditelné v oboru názvů není podporováno.
Pole Pokud je to možné, používejte oblasti místo polí. V případě malých smyček, kde se výkon netýká, může uživatel raději použít rozsahy (souvislou paměť), aby se vyhnul přechodu mimo přidělenou paměť.
Podpora celého čísla Aktuální podpora hardwaru Quantinuum pro celá čísla je omezena na 32bitové hodnoty bez znaménka, i když Q# jsou celá čísla považována za 64bitové podepsané v kódu. Toto omezení může mít vliv na některé bitové operace a porovnání. Pro integrované hybridní programy se doporučuje používat kladné celočíselné hodnoty.
Vrácení konstantních hodnot Programy, které vracejí konstantní Result hodnoty (tj. Zero nebo One) nejsou podporovány.
Omezení klasického registru Každý podporovaný target má počet klasických registrů specifických pro hardware a kompilace může selhat, pokud podkladový program používá více klasických registrů, než je k dispozici. K těmto selháním obvykle dochází u struktur smyčky.

Chybové zprávy a řešení potíží

Neúplná kompilace

  • Kód chyby: honeywell – 1000
  • Chybová zpráva: 1000: Chyba kompilace: Vnitřní chyba: Neúplná kompilace
  • Typ: Chyba úlohy
  • Zdroj: Cílový kompilátor

K této chybě může dojít při odeslání programu, který implementuje některý z následujících scénářů:

  • Nepodporované celočíselné porovnání.

    operation IntegerComparisons() : Bool[] { 
        use register = Qubit[2]; 
        mutable i = 0; 
        if (MResetZ(register[0]) == Zero) { 
            set i += 1; 
        } 
        mutable j = 0; 
        if (MResetZ(register[1]) == One) { 
            set j += 1; 
        } 
        let logicalResults = [ 
            // Supported: equality comparisons with non-negative constants. 
            i == 0, 
            // Supported: equality comparisons between integer variables. 
            i == j, 
            // Not supported: equality comparisons with negative constants. 
            i == -1, 
            // Not supported: non-equality integer comparisons. 
            i < 0, 
            i <= i, 
            i > 0, 
            i >= j 
        ]; 
        return logicalResults; 
    } 
    
  • Nepodporované smyčky, které závisí na výsledcích měření qubitu.

    operation UnboundedLoops() : Result { 
        use q = Qubit(); 
        H(q); 
        use t = Qubit(); 
        repeat { 
            X(t); 
            H(q); 
        } 
        until MResetZ(q) == One; 
        return MResetZ(t); 
    } 
    

Překročení maximálního povoleného počtu klasických registrů

  • Kód chyby: honeywell – 1000
  • Chybová zpráva: 1000: Chyba kompilace: Překročení maximálního povoleného počtu klasických registrů
  • Typ: Chyba úlohy
  • Zdroj: Cílový kompilátor

K této chybě může dojít při odeslání programu, který vyžaduje velký počet klasických registrů. Mezi vzory, které můžou tento problém způsobit, patří smyčky , které obsahují velký počet iterací, hluboce vnořené příkazy if nebo velký počet měření qubitů.

operation ClassicalRegisterUsage() : Result { 
    use q = Qubit(); 
    use t = Qubit(); 
    mutable count = 0; 
    for _ in 1 .. 100 { 
        H(q); 
        if (MResetZ(q) == One) { 
            X(t); 
        } 
        if (MResetZ(t) == One) { 
            set count += 1; 
        } 
    } 
    return MResetZ(t); 
} 

Upozornění QS5023

  • Kód chyby: Upozornění QS5023
  • Chybová zpráva: Nástroj target{0} nepodporuje porovnávání výsledků měření.
  • Typ: Upozornění
  • Zdroj: Cílový kompilátor

Upozornění QS5024

  • Kód chyby: Upozornění QS5024
  • Chybová zpráva: Tady nelze porovnat výsledky měření. Pouze target{0} podporuje porovnání výsledků měření jako součást podmínky příkazu if- nebo elif-v operaci.
  • Typ: Upozornění
  • Zdroj: Cílový kompilátor

Upozornění QS5025

  • Kód chyby: Upozornění QS5025
  • Chybová zpráva: Zde nelze použít návratový příkaz. Nástroj target{0} nepodporuje návratové příkazy v podmíněných blocích, které závisí na výsledku měření.
  • Typ: Upozornění
  • Zdroj: Cílový kompilátor

Upozornění naznačuje, že byste měli mít příkaz return v posledním bloku.

Upozornění QS5026

  • Kód chyby: Upozornění QS5026
  • Chybová zpráva: Proměnnou "{0}" nelze zde znovu přiřadit. V podmíněných blocích, které závisí na výsledku target{1} měření, podporuje pouze opětovné přiřazení proměnných, které byly deklarovány v rámci bloku.
  • Typ: Upozornění
  • Zdroj: Cílový kompilátor

Toto upozornění indikuje, že váš program je potřeba upravit tak, aby běžel na hardwaru target . Definujte operaci pouze pro tělo smyčky, která připraví stav a měří ho, a spusťte ji jako úlohu.

Upozornění QS5027

  • Kód chyby: Upozornění QS5027
  • Chybová zpráva: Volatelné {0} vyžaduje funkce modulu runtime, které nejsou podporovány nástrojem target{1}.
  • Typ: Upozornění
  • Zdroj: Cílový kompilátor

Toto upozornění indikuje, že váš program používá volatelné objekty, které se pokoušejí provádět klasické výpočty, které nejsou podporovány na hardwaru target . Někteří poskytovatelé hardwaru například nepodporují klasické výpočty s datovými Boolean typy nebo Int .

Upozornění QS5028

  • Kód chyby: Upozornění QS5028
  • Chybová zpráva: Tento konstruktor vyžaduje klasickou funkci modulu runtime, kterou targetnepodporuje .
  • Typ: Upozornění
  • Zdroj: Cílový kompilátor

Toto upozornění indikuje, že Q# program používá pokročilé klasické funkce, které musí být optimalizovány během zpracování QIR . Pokud k této optimalizaci nemůže dojít, spuštění programu může selhat v pozdějším kroku kompilace.

Transformace specifická pro cíl se nezdařila.

  • Kód chyby: QATTransformationFailed
  • Chybová zpráva: Zpráva bude specifická pro program
  • Typ: Chyba úlohy
  • Zdroj: Služba Azure Quantum

K této chybě může dojít, protože službě Azure Quantum se nepodařilo transformovat program Quantum Intermediate Representation (QIR) natolik, aby bylo možné program spustit v zadaném targetobjektu . Chybová zpráva obsahuje podrobnosti o QIR, které představují program, a co způsobilo selhání ověření. Neposkytuje však podrobnosti o tom, jak chyba souvisí se zdrojovým kódem.

Scénáře, které můžou způsobit výskyt této chyby, jsou velmi široké. Následující seznam neobsahuje všechny, ale uvádí některé z nejběžnějších:

  • Přístup k prvkům pole, které jsou mimo rozsah pole.

    operation IndexOutOfRange() : Result { 
        use register = Qubit[1]; 
        H(register[1]); 
        return MResetZ(register[1]); 
    } 
    
  • Použití aritmetických operací, které nejsou podporovány targetnástrojem .

    operation UnsupportedArithmetic() : Result { 
        use q = Qubit(); 
        mutable theta = 0.0; 
        for _ in 1 .. 10 { 
            Rx(theta, q); 
            set theta += (0.25 * PI()); 
        } 
        return MResetZ(q); 
    }