7
votes

GPU lit de la CPU ou de la CPU écrit au GPU?

Je suis débutant en programmation parallèle. J'ai une requête qui pourrait sembler être idiote mais je n'ai pas eu de réponse définitive quand je le googlé.

Dans l'informatique GPU, il y a un appareil, c'est-à-dire le GPU et l'hôte I.e. la CPU. J'ai écrit un simple programme Hello World qui allouera une mémoire sur le GPU, passez deux paramètres (dire SRC [] et DEST []) au noyau, copiez SRC String, c'est-à-dire Hello World à DEST String et obtenir la chaîne DEST de GPU à l'hôte.

La chaîne "SRC" est-elle lu par le GPU ou la CPU écrit au GPU? De plus, lorsque nous récupérons la chaîne du GPU, la GPU écrit à la CPU ou à la lecture de la CPU du GPU?

dans le transfert des données de l'arrière et d'avant, il peut y avoir quatre possibilités 1. CPU au GPU - CPU écrit au GPU - GPU lit le formulaire CPU 2. GPU à la CPU - GPU écrit à la CPU - La CPU lit du GPU

Quelqu'un peut-il s'il vous plaît expliquer lequel d'entre eux sont possibles et qui ne sont pas?


0 commentaires

4 Réponses :


7
votes

Dans les versions antérieures de CUDA et des modèles matériels correspondants, le GPU était plus strictement un coprocesseur détenu par la CPU; La CPU a écrit des informations au GPU et lisez les informations lorsque le GPU était prêt. Au niveau inférieur, cela signifiait que vraiment toutes les quatre choses se passaient: la CPU a écrit des données à PCIe, le GPU lu des données de PCIe, le GPU a ensuite écrit des données à PCIe et la CPU a lu le résultat. Mais les transactions ont été initiées par la CPU.

Plus récemment (Cuda 3? 4? Peut-être même à partir de 2?) Certains de ces détails sont cachés du niveau de l'application, de sorte que, efficacement, le code GPU puisse entraîner une initiative de transferts de la même manière que le CPU peut. Considérez l'adressage virtuel unifié, dans lequel les programmeurs peuvent accéder à un espace d'adresses virtuel unifié pour la mémoire CPU et GPU. Lorsque le GPU demande une mémoire dans l'espace de la CPU, cela doit initier un transfert de la CPU, en lisant essentiellement de la CPU. La possibilité de mettre des données sur le GPU du côté du CPU est également conservée. Fondamentalement, toutes les voies sont possibles maintenant, au niveau supérieur (à bas niveaux, il est en grande partie le même type de protocole que toujours: tous deux: les deux sont tous les deux de la lecture et de l'écriture au bus PCIe, mais maintenant, GPUS peut initier des transactions).


3 commentaires

Ce qui, via divers contrôleurs synchronisés, se résume à DMA ( en.wikipedia.org/wiki/direct_memory_access ).


Merci beaucoup. C'est bon de savoir que le GPU peut également initier les transactions aussi. Alors, y a-t-il un moyen de savoir qui a réellement initié les transactions en utilisant l'une des routines de bibliothèque à Opencl? Ou les routines utilisant lesquelles je peux forcer l'UCP ou le GPU à effectuer la transaction.


Je ne sais pas Ocencl aussi bien que je devrais; Cela étant dit, je serais surpris si Cuda ne vous a pas donné un moyen de vérifier où une variable a vécu dans l'espace d'adresses virtuel unifié. Ce type d'informations pourrait être utile, même en dehors de l'utilisation-cas de transferts explicitement gérés (que les nouvelles versions devraient toujours soutenir).



1
votes

in opencl L'hôte (CPU) contrôle exclusivement tous les transferts de données entre GPU et GPU. L'hôte transfère les données sur le GPU utilisant des tampons. Les transferts hôtes (lit) du GPU utilisant des tampons. Pour certains systèmes et appareils, le transfert ne copie pas physiquement des octets car l'hôte et le GPU utilisent la même mémoire physique. Ceci s'appelle zéro copie.


0 commentaires

2
votes

En fait rien de tout cela. Votre code CPU initie la copie des données, mais tandis que les données sont transférées par le contrôleur de mémoire à la mémoire de la GPU via tout bus que vous avez sur votre système. Pendant ce temps, la CPU peut traiter d'autres données. De même, lorsque le GPU a terminé d'exécuter les noyaux que vous avez lancés, votre code de la CPU initie la copie des données, mais par quête du GPU et de la CPU peuvent gérer d'autres données ou exécuter d'autres codes.

Les copies sont appelées asynchrones ou non bloquantes. Vous pouvez éventuellement bloquer des copies dans lesquelles la CPU attend que la copie soit terminée.

Lorsque vous lancez des tâches asynchrones, vous enregistrez généralement un «événement», qui est une sorte de drapeau que vous pouvez vérifier plus tard, pour voir si la tâche est terminée ou non.


0 commentaires