Y at-il un équivalent à memcpy () qui fonctionne dans un noyau CUDA?
Je suis en train de briser et de remodeler la structure d'un tableau de manière asynchrone à l'aide de CUDA noyau. memcpy()
ne fonctionne pas à l'intérieur du noyau, et ni ne cudaMemcpy()
*; je suis à une perte.
Quelqu'un peut me dire la méthode préférée pour la copie de la mémoire à partir de l'intérieur de la CUDA noyau?
Il est intéressant de noter, cudaMemcpy(void *to, void *from, size, cudaMemcpyDeviceToDevice)
ne fonctionnera PAS pour ce que je suis en train de faire, car il ne peut être appelé de l'extérieur du noyau et de ne pas exécuter de manière asynchrone.
source d'informationauteur Zak
Vous devez vous connecter pour publier un commentaire.
cudaMemcpy()
ne fait exécuter de manière asynchrone, mais vous avez raison, il ne peut pas être exécuté à partir d'un noyau.Est la nouvelle forme de la matrice déterminée sur la base de certains calculs? Ensuite, vous exécutez généralement le même nombre de threads qu'il y a des entrées dans votre tableau. Chaque thread exécuter un calcul pour déterminer la source et la destination d'une seule entrée dans le tableau, puis la copier à l'endroit avec une seule commande. (
dst[i] = src[j]
). Si la nouvelle forme de la matrice n'est pas basée sur des calculs, il peut être plus efficace d'exécuter une série decudaMemcpy()
aveccudaMemCpyDeviceToDevice
à partir de l'hôte.Dans mes tests, la meilleure réponse est d'écrire votre propre boucle routine de copie. Dans mon cas:
memcpy
travaille dans un noyau, mais il peut être beaucoup plus lent.cudaMemcpyAsync
à partir de l'hôte est une option valable.J'avais besoin de la partition de 800 contiguë vecteurs de ~33 000 de longueur de longueur de 16 500 dans différents tampon avec 1 600 copie des appels. Synchronisation avec nvvp:
@talonmies rapports que
memcpy
copie octet par octet, qui est inefficace, avec des charges et des magasins. Je suis ciblage de calcul 3.0 donc je ne peux pas tester cudaMemcpy sur l'appareil.Edit: Testé sur les nouveaux appareil. Dispositif d'exécution
cudaMemcpyAsync(out, in, bytes, cudaMemcpyDeviceToDevice, 0)
est comparable à une bonne copie de la boucle et de mieux qu'une mauvaise copie de la boucle. Remarque l'utilisation de l'appareil d'exécution de l'api peut exiger de la compilation des changements (sm>=3.5, compilation séparée). Reportez-vous à guide de programmation et nvcc docs pour la compilation.Appareil
memcpy
mauvais. AccueilcudaMemcpyAsync
d'accord. AppareilcudaMemcpyAsync
bon.