J'observe des accélérations substantielles dans le transfert de données lorsque j'utilise la mémoire épinglée pour les transferts de données CUDA. Sous Linux, l'appel système sous-jacent pour y parvenir est mlock. À partir de la page de manuel de mlock, il indique que le verrouillage de la page l'empêche d'être échangé:
mlock () verrouille les pages dans la plage d'adresses en commençant à addr et en continuant pour len octets. Toutes les pages qui contiennent une partie de la plage d'adresses spécifiée sont garanties de résider dans RAM lorsque l'appel revient avec succès;
Dans mes tests, j'avais quelques concerts de mémoire libre sur mon système, il n'y avait donc aucun risque que les pages de mémoire aient pu être échangées, mais j'ai quand même observé l'accélération. Quelqu'un peut-il expliquer ce qui se passe vraiment ici?, Tout aperçu ou information est très apprécié.
Le pilote CUDA vérifie si la plage de mémoire est verrouillée ou non, puis il utilisera un chemin de code différent. La mémoire verrouillée est stockée dans la mémoire physique (RAM), donc l'appareil peut la récupérer sans l'aide du CPU (DMA, alias copie Async; l'appareil n'a besoin que d'une liste de pages physiques). La mémoire non verrouillée peut générer un défaut de page lors de l'accès, et elle est stockée non seulement dans la mémoire (par exemple, elle peut être échangée), donc le pilote doit accéder à chaque page de mémoire non verrouillée, la copier dans un tampon épinglé et la transmettre à DMA (Syncronious, copie page par page).
Comme décrit ici http://forums.nvidia.com/index.php?showtopic=164661
La mémoire hôte utilisée par l'appel de copie de mémoire asynchrone doit être verrouillée sur la page via cudaMallocHost ou cudaHostAlloc.
Je peux également recommander de consulter les manuels de cudaMemcpyAsync et cudaHostAlloc sur developer.download.nvidia.com. HostAlloc dit que le pilote cuda peut détecter la mémoire épinglée:
Le pilote suit les plages de mémoire virtuelle allouées avec cette fonction (cudaHostAlloc) et accélère automatiquement les appels à des fonctions telles que cudaMemcpy ().
CUDA utilise DMA pour transférer la mémoire épinglée vers le GPU. La mémoire hôte paginable ne peut pas être utilisée avec DMA car ils peuvent résider sur le disque. Si la mémoire n'est pas épinglée) (c'est-à-dire page verrouillée), il est d'abord copié dans une mémoire tampon de "mise en attente" verrouillée, puis copié sur GPU via DMA. En utilisant la mémoire épinglée, vous gagnez du temps pour copier de la mémoire hôte paginable vers la mémoire hôte verrouillée.
Si les pages mémoire n'avaient pas encore été consultées, elles étaient probablement jamais échangées pour commencer. En particulier, les pages nouvellement attribuées seront des copies virtuelles de la "page zéro" universelle et n'auront pas d'instanciation physique tant qu'elles ne seront pas écrites. Les nouvelles cartes de fichiers sur disque resteront également purement sur disque jusqu'à ce qu'elles soient lues ou écrites.