Pourquoi est-CUDA épinglé mémoire si vite?
J'observe substantielle de la vitesse de transfert de données lorsque j'utilise épinglé mémoire pour CUDA transferts de données. Sur linux, le système sous-jacent appel pour la réalisation de ce est mlock. À partir de la page de man de mlock, il indique que le verrouillage de la page, il l'empêche d'être permutée:
mlock() verrouille pages dans la plage d'adresses de départ à l'addr et continue pour len octets. Toutes les pages qui contiennent une partie de l'adresse spécifiée de la gamme sont garantis d'être résident en mémoire lors de l'appel retourne avec succès;
Dans mes tests, j'ai eu un fews concerts de libérer de la mémoire sur mon système, donc il n'y a jamais aucun risque que les pages de mémoire peut avoir été échangé pourtant, j'ai toujours observé le speedup. Quelqu'un peut-il expliquer ce qui se passe réellement ici?, toute réflexion ou de l'info, c'est très apprécié.
- Avez-vous mesurer le temps de mlock lui-même?
- Non, le temps réel d'exécution de la mlock appel est présumé être négligeable(si c'est ce que vous demandez). Le réel des frais généraux est le transfert des données réelles, ce qui dans mon algorithme est une fraction significative de la durée totale du cycle.
- Qu'est-ce que votre CPU? Peut-être, NUMA-activé les nœuds ne bénéficiera pas de la simple
mlock()
. - AMD Phenom(tm) II X4 970 Processeur
Vous devez vous connecter pour publier un commentaire.
CUDA Driver vérifie, si la plage de mémoire est verrouillé ou pas et puis il faudra utiliser un autre codepath. Verrouillé la mémoire est stockée dans la mémoire physique (RAM), de sorte que l'appareil peut chercher w/o de l'aide de l'UC (DMA, aka Async copie; appareil uniquement besoin de la liste des pages physiques). Pas-mémoire verrouillée peut générer une erreur de page sur l'accès, et il est stocké, non seulement dans la mémoire (par exemple, il peut être en swap), de sorte pilote nécessaire pour l'accès à chaque page de la non-mémoire verrouillée, le copier dans épinglé tampon et la transmettre à la DMA (Syncronious, page par page, copie).
Comme décrit ici http://forums.nvidia.com/index.php?showtopic=164661
Je peux également vous recommandons de vérifier cudaMemcpyAsync et cudaHostAlloc manuels à l'developer.download.nvidia.com. HostAlloc dit que cuda conducteur peut détecter épinglé mémoire:
cudaHostRegister
du pointeur de fichier mappé en mémoire?CUDA utiliser le DMA pour le transfert de épinglé mémoire de GPU. Paginable hôte de la mémoire ne peut pas être utilisé avec DMA, car ils peuvent résider sur le disque.
Si la mémoire n'est pas épinglé (c'est à dire la page-verrouillé), c'est d'abord copié dans une page verrouillée "mise en scène" de la mémoire tampon, puis copié sur GPU par DMA.
Donc, en utilisant l'épinglé de la mémoire vous faire gagner du temps à copier à partir de paginable hôte de la mémoire à la page verrouillée de la mémoire hôte.
Si les pages de mémoire n'avait pas été consulté pourtant, ils étaient probablement jamais échangé pour commencer. En particulier, nouvellement allouée pages seront des copies virtuelles de l'universel "zéro page" et n'ont pas un physique d'instanciation jusqu'à ce qu'ils sont écrits à l'. De nouvelles cartes de fichiers sur le disque sera de même rester uniquement sur le disque jusqu'à ce qu'ils sont lus ou écrits.
mlock()
était rapide dans le programme (consultez le commentaire #2 Q).