8 votes

Comment réduire la latence / le délai de synchronisation CUDA ?

Cette question est liée à l'utilisation des flux cuda pour exécuter plusieurs noyaux.

Dans CUDA, il existe de nombreuses commandes de synchronisation. cudaStreamSynchronize, CudaDeviceSynchronize, cudaThreadSynchronize, et aussi cudaStreamQuery pour vérifier si les flux sont vides.

J'ai remarqué en utilisant le profileur que ces commandes de synchronisation introduisent un grand retard dans le programme. Je me demandais si quelqu'un connaît un moyen de réduire cette latence, à part bien sûr utiliser le moins de commandes de synchronisation possible.

Par ailleurs, existe-t-il des chiffres permettant de juger de la méthode de synchronisation la plus efficace ? Considérons 3 flux utilisés dans une application et deux d'entre eux doivent se terminer pour que je puisse lancer un quatrième flux : dois-je utiliser 2 cudaStreamSync ou un seul cudaDeviceSync, ce qui entraînera moins de pertes ?

12voto

ArchaeaSoftware Points 2491

La principale différence entre les méthodes de synchronisation est "polling" et "blocking".

"Polling" est le mécanisme par défaut du pilote pour attendre le GPU - il attend qu'un emplacement mémoire 32 bits atteigne une certaine valeur écrite par le GPU. Il peut renvoyer l'attente plus rapidement une fois l'attente résolue, mais pendant l'attente, il brûle un cœur de CPU en regardant cet emplacement mémoire.

Le "blocage" peut être demandé en appelant cudaSetDeviceFlags() avec cudaDeviceScheduleBlockingSync ou en appelant cudaEventCreate() avec cudaEventBlockingSync . Les attentes de blocage amènent le pilote à insérer une commande dans le tampon de commande DMA qui signale une interruption lorsque toutes les commandes précédentes dans le tampon ont été exécutées. Le pilote peut ensuite mapper l'interruption à un événement Windows ou à un handle de fichier Linux, ce qui permet aux commandes de synchronisation d'attendre sans brûler constamment le CPU, comme le font les méthodes d'interrogation par défaut.

Les requêtes sont essentiellement une vérification manuelle de cet emplacement mémoire de 32 bits utilisé pour les attentes d'interrogation ; ainsi, dans la plupart des situations, elles sont très bon marché. Mais si l'ECC est activé, la requête plongera en mode noyau pour vérifier s'il y a des erreurs ECC ; et sous Windows, toutes les commandes en attente seront envoyées au pilote (ce qui nécessite un thunk du noyau).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X