Udostępnij za pośrednictwem


Jak zoptymalizować uruchamianie dużych programów za pomocą narzędzia do szacowania zasobów

Z tego artykułu dowiesz się, jak zoptymalizować czas wykonywania podczas uruchamiania dużych Q# programów za pomocą narzędzia do szacowania zasobów usługi Azure Quantum.

Aby uzyskać informacje o sposobie uruchamiania narzędzia do szacowania zasobów, zobacz Różne sposoby uruchamiania narzędzia do szacowania zasobów.

Wymagania wstępne

Jeśli chcesz użyć języka Python w programie VS Code, potrzebne są również następujące elementy:

  • Zainstaluj najnowszą wersję języka Python i rozszerzeń Jupyter dla programu VS Code.

  • Najnowszy pakiet usługi Azure Quantum qsharp .

    python -m pip install --upgrade qsharp 
    

Jak obsługiwać duże Q# programy

Po przesłaniu zadania szacowania zasobów do narzędzia do szacowania zasobów program kwantowy jest obliczany całkowicie w celu wyodrębnienia oszacowań zasobów. Jeśli chcesz oszacować zasoby Q# operacji wywoływanej wiele razy, na przykład w pętli z wieloma iteracjami, wykonanie zadania szacowania zasobów może zająć dużo czasu. Jednym ze sposobów zmniejszenia długiego czasu wykonywania jest uruchomienie operacji raz, obliczenie i buforowanie kosztów oraz użycie danych w kolejnych wywołaniach. Ta technika jest nazywana buforowaniem ręcznym.

Ręczne buforowanie

Narzędzie do szacowania target zasobów obsługuje dwie Q# funkcje do ręcznego buforowania: BeginEstimateCaching(name: String, variant: Int): Bool i EndEstimateCaching(): Unit. BeginEstimateCaching funkcja przyjmuje jako dane wejściowe, czyli unikatową name nazwę fragmentu kodu, dla którego chcesz buforować koszty, oraz liczbę całkowitą variant , która rozróżnia różne warianty kosztów dla tego samego fragmentu.

Uwaga

Te dwie specjalne operacje BeginEstimateCaching i EndEstimateCaching są operacjami wewnętrznymi narzędzia do szacowania zasobów. Nie są one obsługiwane przez inne wykonanie targets.

Załóżmy na przykład, że masz operację Q# o nazwie ExpensiveOperation , która jest wywoływana wiele razy w iteracji. Możesz użyć buforowania, aby skrócić czas szacowania:

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

Gdy ExpensiveOperation jest używany wielokrotnie, BeginEstimateCaching jest wywoływany za każdym razem. Gdy BeginEstimateCaching jest wywoływany po raz pierwszy, zwraca true i rozpoczyna akumulację danych kosztów. Spowoduje to kontynuowanie wykonywania kosztownego fragmentu kodu przez kod. Po EndEstimateCaching wywołaniu dane kosztów są przechowywane na potrzeby przyszłego użycia i są uwzględniane w ogólnym koszcie programu.

Gdy ExpensiveOperation jest wywoływany po raz drugi (a następnie), narzędzie do szacowania zasobów znajduje przechowywane (buforowane) dane kosztów, uwzględnia je w ogólnym koszcie programu i zwraca wartość false. Powoduje to pominięcie kosztownego fragmentu kodu, dlatego narzędzie do szacowania zasobów wykonuje program szybciej. EndEstimateCaching należy umieścić na końcu warunku, a regiony ujęte w BeginEstimateCaching-EndEstimateCaching elementy mogą być zagnieżdżone.

SingleVariant() wskazuje, że dane kosztów zebrane podczas pierwszego wykonania mogą być ponownie używane we wszystkich kolejnych wykonaniach fragmentu kodu. Może to nie zawsze być tak. Jeśli na przykład kod ma inny koszt dla nieparzystnych, a nawet wartości zmiennej "c", możesz podać variant wartość:

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

W tym przypadku pamięć podręczna różni się od nieparzystnych, a parzystych cwartości . Innymi słowy, dane zebrane dla parzysłych c wartości są ponownie używane tylko dla parzysłych cwartości , a to samo dotyczy nieparzystwych wartości c.

Uwaga

Jeśli wystąpi jakikolwiek problem podczas pracy z narzędziem do szacowania zasobów, zapoznaj się ze stroną Rozwiązywanie problemów lub skontaktuj się z .AzureQuantumInfo@microsoft.com