次の方法で共有


リソース推定器を使用して大規模なプログラムの実行時間を最適化する方法

この記事では、 Microsoft Quantum リソース推定器 を使用して、大規模な Q# プログラムの実行時間を最適化する方法について説明します。

リソース推定器を実行する方法については、「リソース推定器 を実行するさまざまな方法」を参照してください。

前提条件

VS Code で Python を使用する場合は、次の操作も行う必要があります。

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

  • qdk Python ライブラリの最新バージョンをインストールします。

    python -m pip install --upgrade qdk
    

Q# プログラムを使用した手動キャッシュ

リソース推定ジョブをリソース推定器に送信すると、リソース推定器によって量子プログラム全体が評価され、推定が計算されます。 たとえば、反復回数の多いループなど、 Q# プログラムが同じ操作を何度も呼び出す場合、リソース推定ジョブの実行時間が非常に長い可能性があります。 このようなプログラムの実行時間を短縮するには、操作を 1 回実行してコストを計算してキャッシュし、その後の操作の呼び出しでキャッシュされたデータを使用します。 この手法は、手動キャッシュと呼ばれます。

リソース推定 target では、手動キャッシュを実行するための 2 つの Q# 関数 ( BeginEstimateCachingEndEstimateCaching) がサポートされています。 BeginEstimateCaching関数は、次の入力を受け取ります。

入力パラメーター タイプ [説明]
name コストをキャッシュするコードの一意の名前
variant 整数 同じコードのコストのバリアントを示します

注記

BeginEstimateCachingEndEstimateCachingの 2 つの特殊な操作は、リソース推定器の組み込み操作です。 Q# プログラムにこれらの操作のいずれかが含まれている場合、プログラムは他のシミュレーターまたはハードウェア targetsで実行できません。

たとえば、プログラムで何度も呼び出されるQ#と呼ばれるExpensiveOperation操作があるとします。 コスト見積もりをキャッシュして ExpensiveOperation 実行し、リソース見積もりの合計実行時間を短縮します。

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

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

ExpensiveOperationが 2 回目 (その後) 呼び出されると、リソース推定ツールは、格納されている (キャッシュされた) コスト データを検索し、プログラムの全体的なコストに組み込んで、falseを返します。 これにより、リソース推定器は、コストの高いコード フラグメントの後続の実行をスキップします。 キャッシュが正しく機能するためには、条件の最後に EndEstimateCaching を配置し、BeginEstimateCachingEndEstimateCaching の間に囲まれた領域をネストします。

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

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

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

注記

リソース見積もりツールを使用するときに問題が発生した場合は、[ トラブルシューティング] ページを参照するか、 AzureQuantumInfo@microsoft.comにお問い合わせください。