Architecture SIMT (asynchrone)
Dans le modèle de programmation CUDA, les threads sont le niveau d'abstraction le plus bas pour les opérations de calcul ou de mémoire. En commençant par les appareils basés sur l'architecture GPU NVIDIA Ampere, le modèle de programmation CUDA fournit une accélération des opérations de mémoire via un modèle de programmation asynchrone. Le modèle de programmation asynchrone définit le comportement des opérations asynchrones par rapport aux threads CUDA.
Le modèle de programmation asynchrone définit le comportement des barrières asynchrones . Le modèle explique et définit également comment déplacer des données de manière asynchrone depuis la mémoire globale lors du calcul cuda::memcpy_async
sur le GPU.
fonctionnement asynchrone
Les opérations asynchrones sont définies comme des opérations initiées par un thread CUDA et exécutées de manière asynchrone comme les autres threads. Dans un programme bien structuré, un ou plusieurs threads CUDA se synchronisent avec des opérations asynchrones. Les threads CUDA qui lancent des opérations asynchrones n'ont pas besoin d'être dans des threads synchrones.
Ces threads asynchrones (threads as-if) sont toujours associés au thread CUDA qui a lancé l'opération asynchrone. Les opérations asynchrones utilisent un objet de synchronisation pour synchroniser l'achèvement de l'opération. Ces objets de synchronisation peuvent être gérés explicitement par l'utilisateur (par exemple, cuda::memcpy_async
) ou implicitement dans la bibliothèque (par exemple, cooperative_groups::memcpy_async
).
L'objet de synchronisation peut être cuda::barrier
ou cuda::pipeline
. Ces objets sont détaillés dans Asynchronous Barrier et Asynchronous Data Copies using cuda::pipeline . Ces objets de synchronisation peuvent être utilisés dans différentes portées de thread. Une portée définit un ensemble de threads qui peuvent se synchroniser avec des opérations asynchrones à l'aide d'objets de synchronisation.
Le tableau suivant définit les portées de thread disponibles dans CUDA C++ et les threads qui peuvent se synchroniser avec chaque thread.
Portée du fil | Description |
---|---|
cuda :: thread_scope :: thread_scope_thread | Seul le thread CUDA qui a lancé les opérations asynchrones se synchronise. |
cuda :: thread_scope :: thread_scope_block | Tout ou partie des threads CUDA dans le même bloc de threads que le thread initial se synchronise. |
cuda :: thread_scope :: thread_scope_device | Tout ou partie des threads CUDA dans le même périphérique GPU que le thread initial se synchronise. |
cuda :: thread_scope :: thread_scope_system | Tout ou partie des threads CUDA ou CPU du même système que le thread initial se synchronise. |
Ces portées de thread sont implémentées dans la bibliothèque CUDA Standard C++ en tant qu'extension de Standard C++.