Resource Estimator を使用して大規模なプログラムの実行を最適化する方法

この記事では、Azure Quantum Resource Estimator を使用して大規模なQ# プログラムを実行するときの実行時間を最適化する方法について説明します。

リソース推定ツールを実行する方法については、「 リソース推定ツールを実行する方法を参照してください。

前提条件

VS Code で Python を使用する場合は、次のものが必要です。

  • VS Code の最新バージョンの Python および Jupyter 拡張機能をインストールします。

  • 最新の Azure Quantum qsharp パッケージ。

    python -m pip install --upgrade qsharp 
    

大規模な Q# プログラムを処理する方法

リソース推定ジョブをリソース推定ツールに送信すると、量子プログラムが完全に評価され、リソースの見積もりが抽出されます。 反復回数の多いループなど、何度も呼び出される Q# 操作のリソースを推定する場合、リソース推定ジョブの実行に時間がかかる場合があります。 実行時間を長くする方法の 1 つは、操作を 1 回実行し、そのコストを計算してキャッシュし、後続の呼び出しでデータを使用することです。 この手法は、手動キャッシュと呼ばれます。

手動キャッシュ

Resource Estimator target では、手動キャッシュを実行するための 2 つの Q# 関数 ( BeginEstimateCaching(name: String, variant: Int): BoolEndEstimateCaching(): Unit) がサポートされています。 BeginEstimateCaching 関数は、コストをキャッシュするコード フラグメントの一意の名前である name と、同じフラグメントのコストのさまざまなバリエーションを区別する整数 variant を入力として受け取ります。

Note

BeginEstimateCachingEndEstimateCachingの 2 つの特殊な操作は、Resource Estimator の組み込み操作です。 他の実行 targetsではサポートされていません。

たとえば、反復で何度も呼び出されるExpensiveOperationと呼ばれるQ#操作があるとします。 キャッシュを使用して、推定時間を短縮できます。

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

ExpensiveOperationを繰り返し使用すると、毎回BeginEstimateCachingが呼び出されます。 BeginEstimateCachingが初めて呼び出されると、trueが返され、コスト データの蓄積が開始されます。 これにより、コードは高価なコード フラグメントの実行を続行します。 EndEstimateCaching呼び出されると、コスト データは将来の使用のために格納され、プログラムの全体的なコストに組み込まれます。

ExpensiveOperationが 2 回目 (その後) 呼び出されると、Resource Estimator は、格納されている (キャッシュされた) コスト データを検索し、プログラムの全体的なコストに組み込んで、falseを返します。 これにより、コストの高いコード フラグメントがスキップされるため、Resource Estimator はプログラムをより高速に実行します。 EndEstimateCaching は条件の最後に配置する必要があり、 BeginEstimateCaching-EndEstimateCaching で囲まれた領域は入れ子にすることができます。

SingleVariant() は、最初の実行時に収集されたコスト データを、コード フラグメントの後続のすべての実行で再利用できることを示します。 これは必ずしも当てはまるとは限りません。 たとえば、変数 'c' の奇数値と偶数値に対してコードのコストが異なる場合は、 variant 値を指定できます。

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

この場合、キャッシュは、 cの奇数値と偶数値で異なります。 つまり、 c の偶数値に対して収集されたデータは、 cの偶数値にのみ再利用され、 cの奇数値にも同じことが当てはまります。

Note

リソース推定ツールの使用中に問題が発生した場合は、 トラブルシューティング ページを確認するか、 AzureQuantumInfo@microsoft.comにお問い合わせください。