CUDA global (comme en C) tableaux dynamiques alloué à la mémoire de l'appareil
Donc, j'essaie d'écrire du code qui utilise Nvidia CUDA de l'architecture. J'ai remarqué que la copie vers et depuis l'appareil était vraiment blesser ma performance globale, alors maintenant, je suis en train de déplacer une grande quantité de données sur l'appareil.
Comme ce type de données est utilisé dans de nombreuses fonctions, je voudrais qu'il soit global. Oui, je peux passer des pointeurs, mais je voudrais vraiment savoir comment travailler avec des variables globales dans cette instance.
Donc, j'ai des fonctions de l'appareil qui veulent accéder à un périphérique alloué tableau.
Idéalement, je pourrais faire quelque chose comme:
__device__ float* global_data;
main()
{
cudaMalloc(global_data);
kernel1<<<blah>>>(blah); //access global data
kernel2<<<blah>>>(blah); //access global data again
}
Cependant, je n'ai pas trouvé comment créer un tableau dynamique. J'ai trouvé un travail autour de la déclaration du tableau comme suit:
__device__ float global_data[REALLY_LARGE_NUMBER];
Et tout ce qui ne nécessite pas un cudaMalloc appel, je préfère l'allocation dynamique d'approche.
Pourquoi voulez-vous utiliser des variables globales au lieu de passer le dispositif de pointeur en argument au noyau? Ce faisant vous donne tout de même des limites que l'utilisation de la mémoire globale dans le code de CPU, avec peu d'avantage.
OriginalL'auteur Voltaire | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cela doit probablement travailler.
Lui donner un tourbillon.
OriginalL'auteur
Passer un peu de temps à se concentrer sur l'abondante documentation offert par NVIDIA.
À partir du Guide de Programmation:
C'est un exemple simple de comment allouer de la mémoire. Maintenant, dans vos noyaux, vous devez accepter un pointeur vers un float:
Alors maintenant, vous pouvez les appeler de la sorte:
Il y a quelques bonnes raisons d'utiliser des variables globales. Ce n'est certainement pas un. Je vais le laisser comme un exercice d'étendre cet exemple à inclure le déplacement "devPtr" à une portée globale.
EDIT:
Ok, le problème fondamental est: est-ce votre les grains ne peuvent accéder à la mémoire de l'appareil et le seul champ d'application mondial des pointeurs qu'ils peuvent utiliser sont GPU. Lors de l'appel d'un noyau à partir de votre CPU, les coulisses de ce qui se passe est que les pointeurs et les primitives sont copiés dans GPU registres et/ou de la mémoire partagée avant que le noyau ne soit exécutée.
De sorte que le plus proche que je peux suggérer, c'est ceci: utiliser cudaMemcpyToSymbol() pour atteindre vos objectifs. Mais, dans le fond, considèrent qu'une approche différente pourrait être la bonne Chose.
N'oubliez pas '--host-compilation=c++ " pour cet exemple.
Aussi, n'ai pas vu ton edit. Cependant, im toujours pas sûr de savoir pourquoi un pointeur pour la mémoire de l'appareil n'est pas valide alors qu'un tableau est ok.
OriginalL'auteur
Je suis allé de l'avant et a essayé la solution de l'allocation temporaire pointeur et en passant à une simple fonction globale similaire à kernel1.
La bonne nouvelle, c'est que ça fonctionne 🙂
Cependant, je pense qu'il confond le compilateur comme maintenant, je reçois des avis de: Impossible de dire ce pointeur pointe, en supposant que la mémoire globale de l'espace" à chaque fois que j'essaie d'accéder à des données globales. Heureusement, l'hypothèse qui se passe pour être correcte, mais les avertissements sont ennuyeux.
De toute façon, pour l'enregistrement, j'ai regardé de nombreux exemples et a couru à travers la nvidia exercices où le point est d'obtenir à la sortie-à-dire "Correct!". Cependant, je n'ai pas regardé tous d'entre eux. Si quelqu'un connaît un sdk exemple, là où ils n'globale et dynamique de l'appareil de l'allocation de mémoire, je voudrais quand même savoir.
OriginalL'auteur Voltaire
Erm, c'était exactement le problème de déplacement de devPtr de portée mondiale, qui a été mon problème.
J'ai une application qui fait exactement cela, avec les deux noyaux ayant un pointeur vers les données transmises. J'ai explicitement ne voulez pas passer dans ces pointeurs.
J'ai lu la documentation d'assez près, et de frapper les nvidia forums (et recherchée sur google pour une heure ou deux), mais je n'ai pas trouvé de mise en œuvre d'une dynamique globale de l'appareil tableau qui fonctionne en fait (j'ai essayé plusieurs que de compiler et d'échouer dans des façons nouvelles et intéressantes).
OriginalL'auteur Voltaire
découvrez les échantillons inclus dans le SDK. Beaucoup de ces projets de l'échantillon sont une bonne façon d'apprendre par l'exemple.
OriginalL'auteur Mark Borgerding
-
Que si le noyau fonctionne sur un grand const structure composée de tableaux? À l'aide de la dite constante de la mémoire n'est pas une option, parce que c'est très limitée dans la taille.. alors vous devez le mettre dans la mémoire globale..?
OriginalL'auteur Nils