Poussée à l'intérieur d'utilisateur écrit noyaux
Je suis un newbie à la Poussée. Je vois que tous Poussée des présentations et des exemples montrent le code hôte.
Je voudrais savoir si je peux passer un device_vector à mon propre noyau? Comment?
Si oui, quelles sont les activités autorisées à l'intérieur du noyau/code de l'appareil?
Vous devez vous connecter pour publier un commentaire.
Comme il a été écrit à l'origine, la Poussée est purement un côté hôte de l'abstraction. Il ne peut pas être utilisé à l'intérieur du grain. Vous pouvez transmettre la mémoire de l'appareil encapsulé à l'intérieur d'un
thrust::device_vector
à votre propre noyau, comme ceci:et vous pouvez également utiliser un dispositif de mémoire non allouée par la poussée au sein de la poussée des algorithmes par l'instanciation d'une poussée::device_ptr avec le strict cuda pointeur de la mémoire de l'appareil.
Édité quatre ans et demi plus tard d'ajouter que, comme par @JackOLantern réponse de la poussée de 1,8 ajoute une exécution séquentielle des politiques qui signifie que vous pouvez exécuter à thread unique versions de poussée du alogrithms sur l'appareil. Notez qu'il n'est toujours pas possible de passer directement d'une poussée de l'appareil d'un vecteur du noyau et du dispositif de vecteurs ne peuvent pas être directement utilisés dans le code de l'appareil.
Noter qu'il est également possible d'utiliser la
thrust::device
politique d'exécution, dans certains cas, d'avoir en parallèle de la poussée de l'exécution lancé par un noyau comme un enfant de la grille. Cela nécessite de compilation séparée/appareil de liaison et du matériel qui prend en charge dynamique de parallélisme. Je ne suis pas certain que ce soit réellement pris en charge dans tous poussée des algorithmes ou pas, mais certainement fonctionne avec certains.someKernelCall
pouvez modifier lefooArray
. Notez quefooArray
correspond aux données contenues dansfooVector
.C'est une mise à jour de ma réponse précédente.
De départ de la Poussée 1.8.1, CUDA Poussée primitives peuvent être combinés avec les
thrust::device
l'exécution de la politique pour s'exécuter en parallèle au sein d'un seul CUDA fil exploitation de CUDA dynamique parallélisme. Ci-dessous, un exemple est rapporté.L'exemple ci-dessus effectue des réductions des lignes d'une matrice dans le même sens que Réduire les lignes de la matrice avec CUDA, mais c'est fait différemment dans le post ci-dessus, à savoir, en appelant CUDA Poussée primitives directement à partir de l'utilisateur écrit des noyaux. Aussi, l'exemple ci-dessus sert à comparer la performance de ces opérations lorsqu'il est effectué avec deux stratégies d'exécution, à savoir,
thrust::seq
etthrust::device
. Ci-dessous, certains des graphiques montrant la différence de performance.La performance a été évaluée sur une Kepler K20c et sur un Maxwell GeForce GTX 850M.
Je tiens à fournir une mise à jour de réponse à cette question.
De départ de la Poussée 1.8, CUDA Poussée primitives peuvent être combinés avec les
thrust::seq
politique d'exécution pour exécuter séquentiellement dans un seul CUDA thread (ou de manière séquentielle dans un seul thread CPU). Ci-dessous, un exemple est rapporté.Si vous voulez l'exécution en parallèle à l'intérieur d'un fil, alors vous pouvez envisager d'utiliser CUB qui offre une réduction de routines qui peuvent être appelées depuis un threadblock, à condition que votre carte dynamique permet de parallélisme.
Voici l'exemple avec une Poussée
Si vous voulez utiliser les données affectées ou traitées par la poussée oui, vous pouvez tout simplement obtenir le pointeur brut des données allouées.
si vous souhaitez allouer poussée des vecteurs dans le noyau, je n'ai jamais essayé, mais je ne pense pas que sera le travail
et aussi, si ça marche, je ne pense pas que ça apporte aucun avantage.