2016-12-29 1 views
2

GPU est vraiment rapide quand il s'agit de paralleled computation et effectue CPU en étant 15-30 (certains ont signalé même 50) fois plus rapide cependant, La mémoire GPU est très limitée par rapport à la mémoire CPU et la communication entre la mémoire GPU et le processeur n'est pas aussi rapide. Disons que nous avons quelques données qui ne rentrent pas dans le ram GPU mais nous voulons toujours utiliser , il est merveilleux de calculer. Ce que nous pouvons faire est de diviser ces données en plusieurs parties et de les transmettre au GPU, une par une.Transfert des données vers le GPU pendant que le noyau fonctionne pour gagner du temps

L'envoi de données volumineuses au GPU peut prendre du temps et on pourrait se demander si on diviserait une donnée en deux et alimenterait la première moitié, exécuterait le noyau et nourrirait l'autre moitié pendant l'exécution du noyau.

Selon cette logique, nous devrions gagner du temps, car le transfert de données doit être en cours alors que le calcul est, , espérons- pas interrompre son emploi et une fois terminé, il peut juste, eh bien, continuer son travail sans besoin d'attendre de nouvelles données chemin. Je dois dire que je suis nouveau à gpgpu, nouveau pour cuda mais j'ai expérimenté avec des codes cuda simples et j'ai remarqué que la fonction cudaMemcpy utilisée pour transférer des données entre CPU et GPU bloquera si kerner est en cours d'exécution. Il attendra que le noyau soit fini et fera son travail.


Ma question, est-il possible d'accomplir quelque chose comme ça décrit ci-dessus et si oui, pourrait-on montrer un exemple ou de fournir une source d'information de la façon dont cela pourrait se faire?

Merci!

+0

J'ai besoin d'aide à venir avec un meilleur titre, Serait vraiment reconnaissant, Merci! –

Répondre

6

est-il possible d'accomplir quelque chose comme ça décrit ci-dessus

Oui, il est possible. Ce que vous décrivez est un pipelined algorithme, et CUDA a diverses capacités asynchrones pour l'activer. Le asynchronous concurrent execution section of the programming guide couvre les éléments nécessaires dans CUDA pour le faire fonctionner. Pour utiliser votre exemple, il existe une version non bloquante de cudaMemcpy, appelée cudaMemcpyAsync. Vous aurez besoin de comprendre CUDA flux et comment les utiliser.

Je voudrais également suggérer this presentation qui couvre la plupart de ce qui est nécessaire.

Enfin, here est un exemple travaillé. Cet exemple particulier utilise des rappels de flux CUDA, mais ceux-ci ne sont pas nécessaires pour le traitement en pipeline de base. Ils permettent de déclencher de manière asynchrone des traitements orientés hôte supplémentaires en divers points du pipeline, mais la segmentation de base des données et la livraison des données pendant le traitement ne dépendent pas des rappels de flux. Notez également les exemples de codes CUDA liés dans cette réponse, qui peuvent être utiles pour l'étude/l'apprentissage.

+0

Merci pour la réponse rapide, je vais y jeter un coup d'oeil. –