2012-08-08 1 views
0

Quelqu'un a-t-il réussi à exécuter 2 noyaux différents dans 2 flux CUDA différents et les a-t-il synchronisés? Fondamentalement, je veux avoir 1 noyau A envoyer des données à un autre noyau en cours d'exécution B (dans un flux différent), puis récupérer les résultats. La raison: le noyau A est en cours d'exécution en 1 fil CUDA et je veux un multiple implémentation des threads GPU pour le noyau B.Communication inter-noyau CUDA entre différents flux

C'est avec les GPU haut de gamme (Fermi/Tesla), CUDA 4.2

GPU même, différents cours d'eau . Donc, les données devraient pouvoir être communiquées par périphérique mémoire, mais comment les synchroniser?

+1

Vous demandez si une solution spécifique fonctionnera sans exposer votre problème. Dans ce cas particulier, vous trouverez mieux d'indiquer votre problème afin que la communauté puisse vous proposer des solutions supportées par le modèle de programmation CUDA. –

Répondre

0

Vous devrez effectuer une synchronisation sur l'hôte. Du haut de ma tête, appeler cudaDeviceSynchronize pour chaque flux à son tour devrait faire l'affaire mais ce n'est peut-être pas si simple.

2

Le modèle de programmation CUDA prend uniquement en charge la communication entre threads dans le même bloc de threads (CUDA C Programming Guide à la fin de la section 2.2 Thread Hierarchy). Cela ne peut pas être implémenté de manière fiable via l'API CUDA actuelle. Si vous essayez, vous pouvez trouver un succès partiel. Cependant, cela échouera sur différents systèmes d'exploitation, différentes exécutions de votre application, et cela sera brisé par les futures mises à jour des pilotes et le nouveau matériel (GK110 prend en charge le modèle d'accès simultané amélioré).

0
  • Vos données doivent être en mémoire globale
  • Vous devez obtenir l'adresse de données sur l'hôte
  • Vous devez envoyer ces données au second noyau

votre code doit être quelque chose Similaire à ceci:

* dataToExchange_h, * dataToExchange_d;
cudaMalloc ((void **) dataToExchange, sizeof (données));

kernel1 < < < M1, N1,0, flux1 >>> (dataToExchange);
cudaStreamSynchronize (stream1);
kernel2 < < < M2, N2,0, stream2 >>> (dataToExchange);

Mais notez que la synchronisation de flux ralentit le processus, vous devriez donc l'éviter autant que possible. Vous pouvez également obtenir la synchronisation des flux à travers des événements de cuda, moins évidente et ne donne pas un avantage particulier, mais il est utile de le savoir ;-)

0

Si je pris votre question, vous avez deux problèmes:

  1. échange de données inter-noyau
  2. synchronisation inter-Kernel

1) Inter-noyau d'échange de données peut être réalisé par l'échange de données dans la mémoire globale du dispositif.

2) Comme je le sais, il n'y a pas d'installations fiables pour la synchronisation inter-noyau fournie par CUDA. Et je ne suis pas au courant de tout truc approprié qui peut être appliqué ici.

CUDA C Programming Gide v7.5 nous dit:.. « Applications gérer les opérations simultanées décrites ci-dessus par des flux Un flux est une séquence de commandes (éventuellement émises par différents threads hôtes) qui exécutent pour différents cours d'eau, d'autre part, peut exécuter leurs commandes sont dans le désordre l'une par rapport à l'autre ou simultanément, ce comportement n'est pas garanti et ne devrait donc pas être invoqué pour l'exactitude (par exemple, la communication inter-noyau est indéfinie). "

Questions connexes