Resource Estimator を使用して大規模なプログラムの実行を最適化する方法
この記事では、Azure Quantum Resource Estimator を使用して大規模なQ# プログラムを実行するときの実行時間を最適化する方法について説明します。
リソース推定ツールを実行する方法については、「 リソース推定ツールを実行する方法を参照してください。
前提条件
- 最新バージョンの Visual Studio Code または VS Code on the Web を開きます。
- Azure Quantum 開発キット拡張機能の最新バージョン。 インストールの詳細については、「 VS Code での QDK のインストールを参照してください。
VS Code で Python を使用する場合は、次のものが必要です。
最新の Azure Quantum
qsharp
パッケージ。python -m pip install --upgrade qsharp
大規模な Q# プログラムを処理する方法
リソース推定ジョブをリソース推定ツールに送信すると、量子プログラムが完全に評価され、リソースの見積もりが抽出されます。 反復回数の多いループなど、何度も呼び出される Q# 操作のリソースを推定する場合、リソース推定ジョブの実行に時間がかかる場合があります。 実行時間を長くする方法の 1 つは、操作を 1 回実行し、そのコストを計算してキャッシュし、後続の呼び出しでデータを使用することです。 この手法は、手動キャッシュと呼ばれます。
手動キャッシュ
Resource Estimator target では、手動キャッシュを実行するための 2 つの Q# 関数 ( BeginEstimateCaching(name: String, variant: Int): Bool
と EndEstimateCaching(): Unit
) がサポートされています。 BeginEstimateCaching
関数は、コストをキャッシュするコード フラグメントの一意の名前である name
と、同じフラグメントのコストのさまざまなバリエーションを区別する整数 variant
を入力として受け取ります。
Note
BeginEstimateCaching
とEndEstimateCaching
の 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にお問い合わせください。