CUDA allocation de tableau de tableaux
J'ai un peu de difficulté à allouer tableau de tableaux dans CUDA.
void ** data;
cudaMalloc(&data, sizeof(void**)*N); //allocates without problems
for(int i = 0; i < N; i++) {
cudaMalloc(data + i, getSize(i) * sizeof(void*)); //seg fault is thrown
}
Qu'ai-je tort?
Le point principal est que l'ensemble de ces tableaux est de taille différente.
OriginalL'auteur | 2009-12-02
Vous devez vous connecter pour publier un commentaire.
Vous devez allouer les pointeurs pour un hôte de la mémoire, puis allouer de la mémoire de l'appareil pour chaque tableau et de le stocker du pointeur dans la mémoire hôte.
Ensuite allouer de la mémoire pour stocker les pointeurs dans le dispositif
puis copier l'hôte de la mémoire à la mémoire de l'appareil.
Un exemple vaut 1000 mots:
poser une nouvelle question à SI
Je suppose que tu veux dire N_ARRAYS au lieu de N dans votre fonction principale
OriginalL'auteur fabrizioM
Je ne crois pas que cela soit pris en charge.
cudaMalloc()
alloue de la mémoire de l'appareil, mais stocke l'adresse d'une variable sur l'ordinateur hôte. Dans ta boucle for, vous sont le passage d'adresses dans la mémoire de l'appareil.En fonction de ce que vous voulez accomplir, vous pouvez allouer
data
avec la normale de l'hôtemalloc()
avant l'appel de la boucle for que vous avez actuellement. Ou allouer un seul gros bloc de mémoire de l'appareil et de calculer les décalages dans la main.Regarder des Sections 2.4, 3.2.1 et B. 2.5 (en bas) de la Guide de Programmation CUDA pour plus de détails. Plus précisément, sur le bas de la page 108:
OriginalL'auteur Gabriel
Je pense que dans la première boucle, il doit être
&h_array[i]
pas&d_array[i]
.OriginalL'auteur Jamshidi
vous ne pouvez pas utiliser
pour tableau déclaré que
void *
utilisation de type de données défini
ou
et de le jeter aux
void *
OriginalL'auteur yurijgera
Fil similaire dans les forums de nvidia - http://forums.nvidia.com/index.php?showtopic=69403&st=20
OriginalL'auteur Sayan
J'ai eu le même Problème et a réussi à le résoudre.
FabrizioM réponse était un bon point de départ pour moi et m'a beaucoup aidé. Mais néanmoins, j'ai rencontré quelques problèmes quand j'ai essayé de transférer le code de mon projet. En utilisant le plus de commentaires, posts, j'ai été capable d'écrire un exemple de travail (VS2012, CUDA7.5). Donc je vais poster mon code supplémentaire comme réponse et comme point de départ pour d'autres.
Pour comprendre la désignation: je suis en utilisant un vecteur de OpenCV cv::Mat en entrée qui sont capturées à partir de plusieurs caméras et je suis le traitement de ces images dans le Noyau.
Dans le noyau de lancement, je suis le casting du dispositif de pointeur vers le pointeur de type de données (unsigned short**)
et le noyau de la définition est par exemple:
OriginalL'auteur Christian_B