Оптимизация работы больших программ с помощью средства оценки ресурсов
В этой статье вы узнаете, как оптимизировать время выполнения при выполнении больших Q# программ с помощью средства оценки ресурсов Azure Quantum.
Сведения о том, как запустить средство оценки ресурсов, см. в разделе "Различные способы выполнения оценки ресурсов".
Необходимые компоненты
- Последняя версия Visual Studio Code или откройте VS Code в Интернете.
- Последняя версия расширения Пакета средств разработки Azure Quantum. Дополнительные сведения об установке см. в разделе "Установка QDK" в VS Code.
Если вы хотите использовать Python в VS Code, вам также потребуется следующее:
Установите последнюю версию расширений Python и Jupyter для VS Code.
Последний пакет Azure Quantum
qsharp
.python -m pip install --upgrade qsharp
Обработка больших Q# программ
При отправке задания оценки ресурсов в оценщик ресурсов квантовая программа оценивается полностью, чтобы извлечь оценки ресурсов. Если требуется оценить ресурсы Q# операции, вызываемой много раз, например в цикле с множеством итераций, выполнение задания оценки ресурсов может занять много времени. Одним из способов уменьшения длительного времени выполнения является выполнение операции один раз, вычисление и кэширование затрат и использование данных при последующих вызовах. Этот метод называется ручной кэшированием.
Кэширование вручную
Оценка target ресурсов поддерживает две Q# функции для выполнения ручного кэширования: BeginEstimateCaching(name: String, variant: Int): Bool
и EndEstimateCaching(): Unit
. BeginEstimateCaching
функция принимает в качестве входных данных уникальное имя фрагмента кода, для которого требуется кэшировать затраты name
, и целое число variant
, которое отличает различные варианты затрат для одного фрагмента.
Примечание.
Две специальные операции BeginEstimateCaching
и EndEstimateCaching
являются встроенными операциями для средства оценки ресурсов. Они не поддерживаются другим выполнением targets.
Например, предположим, что у вас есть Q# операция ExpensiveOperation
, которая вызывается много раз в итерации. Кэширование можно использовать для уменьшения времени оценки:
operation ExpensiveOperation(c: Int, b : Bool): Unit {
if BeginEstimateCaching("MyNamespace.ExpensiveOperation", SingleVariant()) {
// Code block to be cached
EndEstimateCaching();
}
}
При ExpensiveOperation
многократном BeginEstimateCaching
использовании вызывается каждый раз. При BeginEstimateCaching
первом вызове возвращается true
и начинается накопление данных о затратах. Это приводит к продолжению выполнения дорогого фрагмента кода. При EndEstimateCaching
вызове данные затрат хранятся для дальнейшего использования и включаются в общую стоимость программы.
При ExpensiveOperation
вызове второго (и последующего) средства оценки ресурсов находит сохраненные (кэшированные) данные о затратах, включает его в общую стоимость программы и возвращает.false
Это приводит к тому, что дорогостоящий фрагмент кода пропускается, поэтому средство оценки ресурсов выполняет программу быстрее. 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
.
Примечание.
Если при работе с оценщиком ресурсов возникла проблема, ознакомьтесь со страницей "Устранение неполадок" или обратитесь к ней.AzureQuantumInfo@microsoft.com