Freigeben über


Optimieren der Laufzeiten für große Programme mit der Ressourcenschätzung

In diesem Artikel erfahren Sie, wie Sie die Microsoft Quantum-Ressourcenschätzung verwenden, um die Laufzeiten für große Q# Programme zu optimieren.

Informationen zum Ausführen der Ressourcenschätzung finden Sie unter "Verschiedene Möglichkeiten zum Ausführen der Ressourcenschätzung".

Voraussetzungen

Wenn Sie Python in VS Code verwenden möchten, müssen Sie auch die folgenden Schritte ausführen:

  • Installieren Sie die neuesten Versionen der Python - und Jupyter-Erweiterungen in VS Code.

  • Installieren Sie die neueste Version der qdk Python-Bibliothek.

    python -m pip install --upgrade qdk
    

Manuelles Zwischenspeichern mit Q#-Programmen

Wenn Sie einen Ressourcenschätzungsauftrag an den Ressourcenschätzer übermitteln, wertet der Ressourcenschätzer Ihr gesamtes Quantenprogramm aus, um die Schätzungen zu berechnen. Wenn Ihr Q# Programm denselben Vorgang mehrmals aufruft, z. B. in einer Schleife mit vielen Iterationen, kann die Laufzeit des Auftrags für die Ressourcenschätzung sehr lang sein. Um die lange Ausführung für diese Arten von Programmen zu reduzieren, können Sie den Vorgang einmal ausführen, um die Kosten zu berechnen und zwischenzuspeichern, und dann die zwischengespeicherten Daten für nachfolgende Aufrufe des Vorgangs verwenden. Diese Technik wird als manuelles Zwischenspeichern bezeichnet.

Die Ressourcenschätzung target unterstützt zwei Q# Funktionen zum Ausführen eines manuellen Zwischenspeicherns: BeginEstimateCaching und EndEstimateCaching. Die BeginEstimateCaching Funktion verwendet die folgenden Eingaben:

Parametereingabe Typ Description
name String Eindeutiger Name für den Codeabschnitt, für den Sie Kosten zwischenspeichern möchten
variant Int Gibt die Variante der Kosten für denselben Codeabschnitt an.

Hinweis

Die beiden speziellen Operationen BeginEstimateCaching und EndEstimateCaching sind intrinsische Operationen für die Ressourcenschätzung. Wenn Ihr Q# Programm einen dieser Vorgänge enthält, kann Ihr Programm nicht auf einem anderen Simulator oder auf anderer Hardware targetsausgeführt werden.

Nehmen wir an, dass Sie eine Q#-Operation namens ExpensiveOperation haben, die in Ihrem Programm mehrmals aufgerufen wird. Zwischenspeichern Sie die zu ausführende ExpensiveOperation Kostenschätzung, um die Gesamtlaufzeit der Ressourcenschätzung zu reduzieren:

operation ExpensiveOperation(c: Int, b : Bool): Unit {
    if BeginEstimateCaching("MyNamespace.ExpensiveOperation", SingleVariant()) {
        // Code block to be cached
        EndEstimateCaching();
    }
}

Die BeginEstimateCaching-Funktion wird jedes Mal aufgerufen, wenn Ihr Programm ExpensiveOperation aufruft. Wenn BeginEstimateCaching zum ersten Mal aufgerufen wird, gibt er true zurück und beginnt, Kostendaten für ExpensiveOperation zu sammeln. Dies führt dazu, dass Ihr Code das teure Codefragment ausführt. Wenn EndEstimateCaching aufgerufen wird, werden die Kostendaten für die zukünftige Nutzung gespeichert und in die Gesamtkosten Ihres Programms integriert.

Wenn ExpensiveOperation die zweite Zeit (und anschließend) aufgerufen wird, findet der Ressourcenschätzer die gespeicherten (zwischengespeicherten) Kostendaten, integriert sie in die Gesamtkosten des Programms und gibt zurück false. Dies bewirkt, dass der Ressourcenschätzer die nachfolgende Ausführung des aufwändigen Codefragments überspringt. Damit die Zwischenspeicherung ordnungsgemäß funktioniert, platzieren Sie EndEstimateCaching am Ende der Bedingung und schachteln Sie Bereiche, die zwischen BeginEstimateCaching und EndEstimateCaching liegen.

Das SingleVariant() Argument gibt an, dass die in der ersten Ausführung ExpensiveOperation gesammelten Kostendaten in allen nachfolgenden Läufen des Codefragments wiederverwendet werden können. Dies ist möglicherweise nicht immer der Fall. Wenn Ihr Code beispielsweise unterschiedliche Kosten für ungerade und gerade Werte einer Variablen chat, können Sie einen variant Wert angeben:

operation ExpensiveOperation(c: Int, b : Bool): Unit {
    if BeginEstimateCaching("MyNamespace.ExpensiveOperation", c % 2) {
        // Some code
        EndEstimateCaching();
    }
}

In diesem Fall unterscheidet sich der Cache für ungerade und gerade c-Werte. Anders ausgedrückt: Daten, die für gerade Werte von c gesammelt werden, werden nur für gerade Werte von c wiederverwendet, und das gleiche gilt für ungerade Werte von c.

Hinweis

Wenn Beim Arbeiten mit der Ressourcenschätzung Probleme auftreten, lesen Sie die Seite "Problembehandlung" oder wenden Sie sich an AzureQuantumInfo@microsoft.com.