Techniques pour Réduire le CPU du GPU de Transfert de Données de Latence
J'ai été à la recherche des moyens de réduire le temps de latence causée par le transfert de données en arrière à partir de la CPU et le GPU. Quand j'ai commencé à utiliser CUDA, j'ai remarqué que le transfert de données entre le CPU et le GPU ne prend que quelques secondes, mais je n'ai pas vraiment parce que ce n'est pas vraiment un sujet de préoccupation pour les petits programmes que je suis été écrit. En fait, le temps de latence n'est probablement pas un problème pour la grande majorité des programmes qui utilisent les Gpu, les jeux vidéo inclus, parce qu'ils sont toujours beaucoup plus vite que s'ils s'exécuter sur le PROCESSEUR.
Cependant, je suis un peu d'un HPC passionné et je suis devenu concernés par l'orientation de mes études, quand j'ai vu l'énorme différence entre le Tianhe-je théoriques de pointe FLOPS et le réel LINPACK performances mesurées. Ce qui a soulevé mes préoccupations quant à savoir si je vais prendre le droit chemin de carrière.
Utilisation de épinglé mémoire (page verrouillée) de la mémoire par le biais de l'utilisation de la cudaHostAlloc fonction() est une méthode qui permet de réduire le temps de latence (très efficace), mais existe-il d'autres techniques que je ne suis pas au courant? Et pour être clair, je parle de l'optimisation du code, pas le matériel lui-même (c'est NVIDIA et d'AMD emplois).
Juste que d'un côté de la question, je suis conscient que Dell et HP vendre Tesla serveurs. Je suis curieux de savoir comment bien un GPU exploite une base de données de l'application, où vous auriez besoin d'une constante de lire à partir du disque dur (HDD ou SSD), une opération que le PROCESSEUR peut effectuer,
- Vous pourriez trouver cela amusant: cs.virginia.edu/~skadron/Documents/bakkum_sqlite_gpgpu10.pdf
- Vous avez raison, cet article décrit le particulier le défi que j'avais en tête. Merci...
- Au sujet de la faible flop-efficacité de Tianhe-IA: bien que les Gpu ont d'énormes arithmétique de puissance (qui ideed est souvent difficile d'utiliser pleinement), n'oubliez pas que le GPU de la mémoire de l'architecture joue également un rôle important et même liée au calcul des noyaux peut sérieusement surpasser CPU implémentations.
Vous devez vous connecter pour publier un commentaire.
Il ya quelques façons d'aborder CPU-GPU de la communication frais généraux - j'espère que c'est ce que tu veux dire par la latence et pas le temps de latence du transfert lui-même. Notez que j'ai volontairement utilisé le terme adresse au lieu de réduire que vous n'avez pas nécessairement besoin de réduire le temps de latence si vous pouvez le masquer. Notez aussi que je suis beaucoup plus familier avec CUDA, donc, ci-dessous je ne reportez-vous à CUDA, mais certaines fonctionnalités sont également disponibles dans OpenCL.
Comme vous l'avez mentionné page-mémoire verrouillée est le but même de l'augmenter. En outre, on peut de la carte page-verrouillé la mémoire hôte pour le GPU, mécanisme qui permet l'accès direct des données affectées par le GPU noyau sans le besoin pour plus de transfert de données. Ce mécanisme est appelé zéro-copie transfert et c'est utile si les données sont lues/écrites qu'une seule fois accompagné par une importante quantité de calcul et pour le Gpu avec pas de mémoire (mobile). Toutefois, si le noyau d'accéder à zéro les données copiées n'est pas fortement liée au calcul et donc la latence d'accès aux données ne peut pas être caché, page verrouillée, mais pas de la mémoire mappée sera plus efficace. En outre, si les données ne rentre pas dans la mémoire graphique, zéro-copie aura encore du travail.
Notez que la quantité excessive de la page-mémoire verrouillée peut causer de sérieux ralentissement sur le CPU côté.
Abordent le problème sous un angle différent, comme tkerwin mentionné, de transfert asynchrone (wrt le thread CPU parler pour le GPU) est la clé de cacher CPU-GPU de transfert de latence par le chevauchement des calcul sur le CPU avec le transfert. Ceci peut être réalisé avec
cudaMemcpyAsync()
ainsi que l'utilisation de zéro-copie asynchrone exécution du noyau.On peut prendre encore plus loin en utilisant de multiples flux de chevauchement avec transfert d'exécution du noyau. Notez que les flux de planification peut-être besoin d'une attention spéciale pour de bon qui se chevauchent, Tesla et Quadro double moteur DMA qui permet simultanément de transfert de données vers et à partir de GPU.
En outre, avec CUDA 4.0, il est devenu plus facile d'utiliser un GPU à partir de plusieurs threads CPU, donc dans un environnement multi-threaded code de CPU chaque thread peut envoyer ses propres données pour le GPU et de lancer de noyaux plus facile.
Enfin, GMAC met en œuvre un système asymétrique de la mémoire partagée modèle pour CUDA. L'une de ses caractéristiques intéressantes est la cohérence des modèles qu'il fournit, en particulier paresseux - et le laminage de mise à jour qui permet de transférer uniquement les données modifiées sur le CPU dans un bloqué de la mode.
Pour plus de détails, voir le document suivant: Gelado et coll. - Une Asymétrie De Mémoire Partagée Distribuée
Modèle Hétérogène de Systèmes Parallèles.
Vous pouvez utiliser
cudaMemcpyAsync()
le chevauchement du travail que vous faites sur le CPU avec transfert de mémoire. Cela ne va pas baisser la latence d'un transfert de données, mais il peut améliorer la performance globale d'un algorithme. Il y a quelques informations à ce sujet dans le CUDA C les Meilleures Pratiques guide.Si la latence est un problème, il pourrait être intéressant de regarder dans les options vous pouvez faire avec l'AMD fusion de l'architecture. La latence est considérablement réduit et peut dans certains cas être plus rapide que le CPU transferts à partir de la RAM. Cependant, vous prenez un gain de performance avec l'utilisation de l'allégée non-GPU dédié.