Optimieren der Ausführung großer Programme mit dem Ressourcenschätzer
In diesem Artikel erfahren Sie, wie Sie die Ausführungszeit beim Ausführen großer Q# Programme mit dem Azure Quantum Resource Estimator optimieren.
Informationen zum Ausführen der Ressourcenstimator finden Sie unter "Verschiedene Möglichkeiten zum Ausführen des Ressourcenstimators".
Voraussetzungen
- Die neueste Version von Visual Studio Code oder öffnen Sie VS Code im Web.
- Die neueste Version der Azure Quantum Development Kit-Erweiterung. Installationsdetails finden Sie unter Installieren des QDK unter VS Code.
Wenn Sie Python in VS Code verwenden möchten, benötigen Sie auch Folgendes:
Installieren Sie die neueste Version der Python- und Jupyter-Erweiterungen für VS Code.
Das neueste Azure Quantum-Paket
qsharp
.python -m pip install --upgrade qsharp
So behandeln Sie große Q# Programme
Wenn Sie einen Ressourcenschätzungsauftrag an den Ressourcenschätzer übermitteln, wird das Quantenprogramm vollständig ausgewertet, um die Ressourcenschätzungen zu extrahieren. Wenn Sie die Ressourcen eines Q# Vorgangs schätzen möchten, der oft aufgerufen wird, z. B. in einer Schleife mit vielen Iterationen, kann die Ausführung des Ressourcenschätzungsauftrags eine lange Zeit dauern. Eine Möglichkeit, lange Ausführungszeiten zu reduzieren, besteht darin, den Vorgang einmal auszuführen, die Kosten zu berechnen und zwischenzuspeichern und die Daten für nachfolgende Aufrufe zu verwenden. Diese Technik wird als manuelles Zwischenspeichern bezeichnet.
Manuelles Zwischenspeichern
Die Ressourcenstimator target unterstützt zwei Q# Funktionen zum Ausführen eines manuellen Zwischenspeicherns: BeginEstimateCaching(name: String, variant: Int): Bool
und EndEstimateCaching(): Unit
. BeginEstimateCaching
die Funktion verwendet als Eingaben, name
bei denen es sich um den eindeutigen Namen des Codefragments handelt, für das Sie Kosten zwischenspeichern möchten, und eine ganze Zahl variant
, die unterschiedliche Kostenvarianten für dasselbe Fragment unterscheidet.
Hinweis
Die beiden speziellen Vorgänge und EndEstimateCaching
sind systeminterne Vorgänge BeginEstimateCaching
für die Ressourcenschätzung. Sie werden von anderer Ausführung targetsnicht unterstützt.
Angenommen, Sie haben einen Q# Vorgang aufgerufen, der in einer Iteration mehrmals aufgerufen ExpensiveOperation
wird. Sie können zwischenspeichern, um die Geschätzte Zeit zu reduzieren:
operation ExpensiveOperation(c: Int, b : Bool): Unit {
if BeginEstimateCaching("MyNamespace.ExpensiveOperation", SingleVariant()) {
// Code block to be cached
EndEstimateCaching();
}
}
Wenn ExpensiveOperation
sie wiederholt verwendet wird, BeginEstimateCaching
wird jedes Mal aufgerufen. Wenn BeginEstimateCaching
sie zum ersten Mal aufgerufen wird, wird sie zurückgegeben true
und beginnt mit der Akkumulation von Kostendaten. Dies führt dazu, dass Der Code mit der Ausführung des teuren Codefragments fortfährt. Wenn EndEstimateCaching
sie aufgerufen wird, werden die Kostendaten für die zukünftige Nutzung gespeichert und in die Gesamtkosten des Programms integriert.
Wenn ExpensiveOperation
die zweite Zeit (und anschließend) aufgerufen wird, findet der Ressourcen-Estimator die gespeicherten (zwischengespeicherten) Kostendaten, integriert sie in die Gesamtkosten des Programms und gibt zurück false
. Dies bewirkt, dass teure Codefragmente übersprungen werden, daher führt der Ressourcen-Estimator das Programm schneller aus. EndEstimateCaching
sollte am Ende der Bedingung platziert werden, und regionen, die eingeschlossen BeginEstimateCaching-EndEstimateCaching
sind, können geschachtelt werden.
SingleVariant()
gibt an, dass die für die erste Ausführung gesammelten Kostendaten in allen nachfolgenden Ausführungen 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 "c" aufweist, 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 Werte von c
. Anders ausgedrückt: Daten, die für gerade Werte c
gesammelt werden, werden nur für gerade Werte c
wiederverwendet, und das gleiche gilt für ungerade Werte von c
.
Hinweis
Wenn beim Arbeiten mit der Ressourcenschätzung probleme auftreten, schauen Sie sich die Seite "Problembehandlung" an, oder wenden Sie sich an den Kontakt AzureQuantumInfo@microsoft.com.