Поделиться через


Оптимизация работы больших программ с помощью средства оценки ресурсов

В этой статье вы узнаете, как оптимизировать время выполнения при выполнении больших Q# программ с помощью средства оценки ресурсов Azure Quantum.

Сведения о том, как запустить средство оценки ресурсов, см. в разделе "Различные способы выполнения оценки ресурсов".

Необходимые компоненты

Если вы хотите использовать 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