Partager via


Comment optimiser l’exécution de programmes volumineux avec l’estimateur de ressources

Dans cet article, vous allez apprendre à optimiser le temps d’exécution lors de l’exécution de programmes volumineux Q# avec l’estimateur de ressources Azure Quantum.

Pour plus d’informations sur l’exécution de l’estimateur de ressources, consultez Différentes façons d’exécuter l’estimateur de ressources.

Prérequis

Si vous souhaitez utiliser Python dans VS Code, vous avez également besoin des éléments suivants :

  • Installez la dernière version des extensions Python et Jupyter pour VS Code.

  • Dernier package Azure Quantum qsharp .

    python -m pip install --upgrade qsharp 
    

Comment gérer des programmes volumineux Q#

Lorsque vous soumettez un travail d’estimation de ressource à l’estimateur de ressources, le programme quantique est évalué complètement pour extraire les estimations des ressources. Si vous souhaitez estimer les ressources d’une Q# opération appelée plusieurs fois, par exemple, dans une boucle avec de nombreuses itérations, l’exécution du travail d’estimation des ressources peut prendre beaucoup de temps. Une façon de réduire les temps d’exécution longs consiste à exécuter l’opération une seule fois, à calculer et à mettre en cache ses coûts, et à utiliser les données sur les appels suivants. Cette technique est appelée mise en cache manuelle.

Mise en cache manuelle

L’estimateur target de ressources prend en charge deux Q# fonctions pour effectuer une mise en cache manuelle : BeginEstimateCaching(name: String, variant: Int): Bool et EndEstimateCaching(): Unit. BeginEstimateCaching la fonction prend comme entrées un name nom unique du fragment de code pour lequel vous souhaitez mettre en cache les coûts, et un entier variant qui distingue différentes variantes de coût pour le même fragment.

Remarque

Les deux opérations BeginEstimateCaching spéciales et EndEstimateCaching sont des opérations intrinsèques pour l’estimateur de ressources. Ils ne sont pas pris en charge par d’autres exécutions targets.

Par exemple, supposons que vous ayez une Q# opération appelée ExpensiveOperation plusieurs fois dans une itération. Vous pouvez utiliser la mise en cache pour réduire son temps d’estimation :

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

Lorsqu’il ExpensiveOperation est utilisé à plusieurs reprises, BeginEstimateCaching est appelé chaque fois. Lorsqu’elle BeginEstimateCaching est appelée pour la première fois, elle retourne true et commence l’accumulation des données de coût. Cela entraîne l’exécution du code du fragment de code coûteux. Lorsqu’elles EndEstimateCaching sont appelées, les données de coût sont stockées pour l’utilisation future et elles sont incorporées dans le coût global du programme.

Lorsqu’il ExpensiveOperation est appelé deuxième fois (et par la suite), l’estimateur de ressources recherche les données de coût stockées (mises en cache), les incorpore dans le coût global du programme et retourne false. Cela entraîne l’ignorer des fragments de code coûteux, ce qui accélère l’exécution du programme par l’estimateur de ressources. EndEstimateCaching doit être placé à la fin de la condition, et les régions placées entre elles BeginEstimateCaching-EndEstimateCaching peuvent être imbriquées.

SingleVariant() indique que les données de coût collectées lors de la première exécution peuvent être réutilisées dans toutes les exécutions suivantes du fragment de code. Ce n’est peut-être pas toujours le cas. Par exemple, si votre code a un coût différent pour les valeurs impaires et paires d’une variable « c », vous pouvez fournir une variant valeur :

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

Dans ce cas, le cache est différent pour les valeurs impaires et paires de c. En d’autres termes, les données collectées pour des valeurs égales sont c réutilisées uniquement pour les valeurs paires de c, et les mêmes s’appliquent aux valeurs impaires de c.

Remarque

Si vous rencontrez un problème lors de l’utilisation de l’estimateur de ressources, consultez la page Résolution des problèmes ou contactez AzureQuantumInfo@microsoft.com.