Quantum Development Kit (QDK) – Ressourcenschätzung

Wie der Name besagt, dient die ResourcesEstimator-Klasse zum Schätzen der erforderlichen Ressourcen für das Ausführen einer bestimmten Instanz einer Q#-Operation auf einem Quantencomputer. Zu diesem Zweck wird die Quantenoperation ausgeführt, ohne den Zustand eines Quantencomputers zu simulieren. Aus diesem Grund werden Ressourcen für Q#-Operationen geschätzt, die Tausende von Qubits verwenden, sofern der klassische Teil des Codes in einem angemessenen Zeitraum ausgeführt wird.

Die Ressourcenschätzung basiert auf dem Ablaufverfolgungssimulator für Quantencomputer, der einen umfangreicheren Satz von Metriken und Tools zum Debuggen von Q#-Programmen bereitstellt.

Aufrufen und Ausführen der Ressourcenschätzung

Sie können mit der Ressourcenschätzung jede Q#-Operation durchführen. Weitere Informationen finden Sie unter Möglichkeiten zum Ausführen eines Q#-Programms.

Aufrufen der Ressourcenschätzung aus C#

Wie bei anderen Zielcomputern auch, erstellen Sie zuerst eine Instanz der Klasse ResourcesEstimator und übergeben sie anschließend als ersten Parameter der Run-Methode einer Operation.

Beachten Sie hierbei Folgendes: Im Gegensatz zur Klasse QuantumSimulator wird mit der Klasse ResourcesEstimator nicht die IDisposable-Schnittstelle implementiert, sodass Sie sie nicht in eine using-Anweisung einschließen müssen.

using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Quantum.MyProgram
{
    class Driver
    {
        static void Main(string[] args)
        {
            ResourcesEstimator estimator = new ResourcesEstimator();
            MyQuantumProgram.Run(estimator).Wait();
            Console.WriteLine(estimator.ToTSV());
        }
    }
}

Wie das Beispiel zeigt, stellt ResourcesEstimator die ToTSV()-Methode bereit, die eine Tabelle mit durch Tabstopp getrennten Werten (Tab-Separated Values, TSV) generiert. Sie können die Tabelle in einer Datei speichern oder zur Analyse in der Konsole anzeigen. Nachfolgend sehen Sie eine Beispielausgabe des vorherigen Programms:

Metric          Sum
CNOT            1000
QubitClifford   1000
R               0
Measure         4002
T               0
Depth           0
Width           2
BorrowedWidth   0

Hinweis

Die Berechnungen einer ResourcesEstimator-Instanz werden nicht bei jeder Ausführung zurückgesetzt. Wenn Sie mit derselben Instanz eine andere Operation ausführen, werden die neuen Ergebnisse mit den vorhandenen Ergebnissen aggregiert. Wenn Sie Berechnungen zwischen Ausführungen zurücksetzen müssen, erstellen Sie für jede Ausführung eine neue Instanz.

Aufrufen der Ressourcenschätzung in Python

Verwenden Sie die estimate_resources()-Methode aus der Python-Bibliothek mit der importierten Q#-Operation:

qubit_result = myOperation.estimate_resources()

Aufrufen der Ressourcenschätzung über die Befehlszeile

Verwenden Sie beim Ausführen eines Q#-Programms über die Befehlszeile den Parameter --simulator (oder die Kurzform -s), um den ResourcesEstimator-Zielcomputer anzugeben. Mit dem folgenden Befehl wird ein Programm mithilfe der Ressourcenschätzung ausgeführt:

dotnet run -s ResourcesEstimator

Aufrufen der Ressourcenschätzung in Jupyter Notebook

Führen Sie die Q#-Operation mithilfe des IQ#-Magic-Befehls %estimate aus.

%estimate myOperation

Programmgesteuertes Abrufen der geschätzten Daten

Zusätzlich zu einer TSV-Tabelle können Sie mit der Data-Eigenschaft der Ressourcenschätzung die während der Ausführung geschätzten Ressourcen programmgesteuert abrufen. Die Data-Eigenschaft stellt eine System.DataTable-Instanz mit zwei Spalten bereit: Metric und Sum, indiziert nach den Namen der Metriken.

Der folgende Code zeigt, wie die Gesamtzahl der von einer Q#-Operation verwendeten QubitClifford-, T- und CNOT-Operationen abgerufen und ausgegeben wird:

using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Quantum.MyProgram
{
    class Driver
    {
        static void Main(string[] args)
        {
            ResourcesEstimator estimator = new ResourcesEstimator();
            MyQuantumProgram.Run(estimator).Wait();

            var data = estimator.Data;
            Console.WriteLine($"QubitCliffords: {data.Rows.Find("QubitClifford")["Sum"]}");
            Console.WriteLine($"Ts: {data.Rows.Find("T")["Sum"]}");
            Console.WriteLine($"CNOTs: {data.Rows.Find("CNOT")["Sum"]}");
        }
    }
}

Gemeldete Metriken

Mit der Ressourcenschätzung werden die folgenden Metriken nachverfolgt:

Metrik Beschreibung
CNOT Die Anzahl der ausgeführten CNOT-Operationen (auch als „kontrollierte Pauli-X-Operationen“ bezeichnet)
QubitClifford Die Anzahl der ausgeführten Clifford- und Pauli-Qubit-Operationen
Measure Die Anzahl der ausgeführten Messungen
R Die Anzahl der ausgeführten Ein-Qubit-Drehungen, unter Ausschluss von T-, Clifford- und Pauli-Operationen
T Die Anzahl der ausgeführten T-Operationen und ihrer Konjugationen, einschließlich der T-Operationen T_x = H.T.H und T_y = Hy.T.Hy
Tiefe Die Tiefe der Quantenschaltung, die durch die Q#-Operation ausgeführt wird (siehe unten). Standardmäßig zählt die Tiefenmetrik nur T-Gates. Weitere Informationen finden Sie unter Tiefenindikator.
Width Die Breite der Quantenschaltung, die durch die Q#-Operation ausgeführt wird (siehe unten). Standardmäßig zählt die Tiefenmetrik nur T-Gates. Weitere Informationen finden Sie unter Breitenindikator.
QubitCount Die untere Grenze für die maximale Anzahl von Qubits, die während der Ausführung der Q#-Operation zugeordnet werden. Diese Metrik ist möglicherweise nicht mit Depth (siehe unten) kompatibel.
BorrowedWidth Die maximale Anzahl von Qubits, die in der Q#-Operation geliehen werden.

„Depth“, „Width“ und „QubitCount“

Die berichteten Tiefen- und Breitenschätzungen sind miteinander kompatibel. (Bisher konnten beide Metriken erzielt werden, jedoch waren unterschiedliche Schaltungen für „Depth“ und „Width“ erforderlich.) Derzeit können beide Metriken in diesem Paar gleichzeitig durch dieselbe Schaltung erzielt werden.

Die folgenden Metriken werden gemeldet:

Depth: Für die Stammoperation – die für die Ausführung erforderliche Zeit, wenn bestimmte Gatezeiten vorausgesetzt werden. Für aufgerufene oder nachfolgende Operationen – die Zeitdifferenz zwischen der letzten Zeit der Qubit-Verfügbarkeit am Anfang und am Ende der Operation.

Width: Für die Stammoperation – die Anzahl der Qubits, die tatsächlich für die Ausführung der Operation (und die von ihr aufgerufene Operation) verwendet wurden. Für aufgerufene Operationen oder nachfolgende Operationen – die Anzahl der Qubits, die zusätzlich zu den bereits am Anfang der Operation verwendeten Qubits verwendet wurden.

Beachten Sie, dass wiederverwendete Qubits nicht zu dieser Zahl beitragen. Wenn beispielsweise einige Qubits vor Beginn der Operation A freigegeben wurden und alle von dieser Operation A (und von über A aufgerufenen Operationen) angeforderten Qubits durch die Wiederverwendung zuvor freigegebener Qubits bereitgestellt wurden, wird als Width der Operation A 0 angegeben. Erfolgreich geliehene Qubits tragen ebenfalls nicht zu „Width“ bei.

QubitCount: Für die Stammoperation – die Mindestanzahl von Qubits, die für das Ausführen dieser Operation (und von dieser aufgerufenen Operationen) ausreichen. Für aufgerufene Operationen oder nachfolgende Operationen – die Mindestanzahl von Qubits, die für das eigenständige Ausführen dieser Operation ausreichen. Diese Zahl enthält keine Eingabe-Qubits. Sie enthält jedoch geliehene Qubits.

Es werden zwei Ausführungsmodi unterstützt. Der Modus wird durch Festlegen von QCTraceSimulatorConfiguration.OptimizeDepth ausgewählt.

OptimizeDepth=true: Der QubitManager soll Qubits nicht wiederverwenden und ordnet jedes Mal, wenn ein Qubit angefordert wird, ein neues Qubit zu. Für die Stammoperation wird Depth die Mindesttiefe (untere Grenze). Für diese Tiefe wird eine kompatible Width gemeldet (beide Metriken können gleichzeitig erzielt werden). Beachten Sie, dass diese Breite wahrscheinlich nicht der optimale Wert für die vorhandene Tiefe ist. QubitCount kann für die Stammoperation geringer als Width sein, da Wiederverwendung angenommen wird.

OptimizeDepth=false: Der QubitManager soll Qubits wiederverwenden und verwendet freigegebene Qubits erneut, bevor er neue Qubits zuordnet. Für die Stammoperation wird Width die Mindestbreite (untere Grenze). Die kompatible Depth wird gemeldet, woraufhin sie erreicht werden kann. QubitCount und Width sind für die Stammoperation identisch, solange keine Qubits geliehen werden.

Angeben der Wahrscheinlichkeit von Messergebnissen

Sie können mit AssertMeasurementProbability operation aus dem Microsoft.Quantum.Diagnostics namespace-Namespace Informationen über die erwartete Wahrscheinlichkeit einer Messungsoperation bereitstellen. Weitere Informationen finden Sie unter Ablaufverfolgungssimulator für Quantencomputer.

Siehe auch