CUPTI est une bibliothèque fournie par NVIDIA. Elle permet entre autre de récupérer des évènements concernant la gestion de la mémoire unifiée. C'est dans ce contexte qu'Arcane utilise CUPTI.
L'utilisation de CUPTI se fait via des variables d'environnement
Variable d'environnement | Description |
---|---|
ARCANE_CUPTI_LEVEL | Indique les évènements qu'on veut tracer. A noter que pour le niveau 2 il faut un accès exclusif au GPU et donc ce mode ne fonctionne pas en parallèle. Les valeurs possibles sont:
|
ARCANE_CUPTI_FLUSH | Indique à quel moment on affiche les informations sur les évènements. Pour avoir un suivi précis il est nécessaire d'afficher les informations après chaque exécution de noyau GPU mais ce mode peut augmenter d'une facteur important le temps d'exécution. Les valeurs possibles sont:
|
ARCANE_CUPTI_PRINT | Indique si on souhaite effectuer un affichage pour chaque évènement. Cela peut ralentir considérablement le temps d'exécution. Les valeurs possibles sont:
|
ARCANE_CUDA_MALLOC_TRACE | Indique si on souhaite tracer tous les appels à
|
ARCANE_CUDA_UM_PAGE_ALLOC | Indique la manière d'allouer via
|
L'exemple suivant permet de tracer les transferts en mémoire unifiée et d'afficher le nom du tableau associé.
Avec le résultat suivant
Les deux valeurs après UNIFIED_MEMORY_COUNTER
correspondent au temps de début et de fin du tranfert. Les autres champs sont:
address
: adresse mémoire du tableaukind
: type de tranfert (Host to device
ou Device to host
)value
: quantité (en octet) de mémoire tranféréeflags
: si 2
alors le tranfert est explicitement demandé par le code. Si 3
, il s'agit d'un tranfert spéculatif initié par le driver NVIDIA.source
et destination
: numéro du devicename
: nom du tableau Arcane. Cela n'est actif que si la variable d'environnement ARCANE_CUDA_MALLOC_TRACE
vaut au moins 1. Si le transfert n'est pas lié à un tableau Arcane (UniqueArray ou NumArray), il n'y aura pas de nom associé. A noter que comme les transferts se font page par page, il est possible que le tableau indiqué ne soit pas celui qui a provoqué le transfert. Pour éviter cet effet, il est possible d'allouer une page pour chaque allocation en positionnant la variable d'environnement ARCANE_CUDA_UM_PAGE_ALLOC
à 1
.En fin de calcul est affiché la quantité totale de mémoire transférée et le nombre de transferts. Par exemple:
Dans cet exemple, on a fait 680 transferts du CPU vers le GPU pour 17Mo de données transférées. On a fait 301 transferts du GPU vers le CPU pour 7Mo de données transférées.