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
- La dernière version de Visual Studio Code ou ouvrir VS Code sur le web.
- La dernière version de l’extension Kit de développement Azure Quantum. Pour plus d’informations sur l’installation, consultez Installation du QDK sur VS Code.
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.