2017-04-12 1 views
-2

J'utilise cudaMallocHost() avec cudaFreeHost() dans une classe. Un exemple de mon code:cudaFreeHost() erreur arguments invalides

#include "cuda.h" 
#include "cuda_runtime.h" 

class myClass{ 
public: 
    int* bitmap[5]; 
    void Malloc(){ 
     for (int i = 0 ; i < 5 ; i++){ 
      cudaMallocHost(&bitmap[i], sizeof(int)*10000); 
      memset(bitmap[i], 0, sizeof(int)*10000); 
     } 
    } 
    void Delete(){ 
     for (int i = 0 ; i < 5; i++){ 
      cudaFreeHost(bitmap[i]); 
     } 
    } 
}; 
int main(){ 
    myClass mc; 
    mc.Malloc(); 
    //copy 'bitmap[]' to gpu and call some kernel function 
    cudaDeviceSynchronize(); 
    mc.Delete(); 
} 

L'erreur de retour de code ci-dessus des arguments non valides (valeur 11) lors de l'appel cudaFreeHost(), cudaFreeHost ne renvoie aucune erreur.

J'ai essayé de changer de tableau de pointeur en variable différente mais les erreurs se produisent toujours. J'ai même mis le cudaFreeHost() juste après cudaMallocHost() mais il y a encore des erreurs.

J'ai vérifié que l'erreur ne se produit pas à chaque fois que j'appelle cudaFreeHost(). Le cudaDeviceSynchronize() est ajouté pour s'assurer que toutes les opérations de copie sont effectuées.

Si je change toute l'opération cudaHost en fonctionnement normal (c'est-à-dire nouveau et supprimer), le programme fonctionne correctement.

J'ai essayé de changer chaque variable dans bitmap à b1, b2, b3, b4, b5 comme suit, mais la même erreur se produit.

cudaMallocHost(&b1, sizeof(int) * 10000); 
cudaFreeHost(b1); 
+0

Pouvez-vous fournir votre code original? l'exemple que vous fournissez n'est pas légal C++ – willkill07

+0

try 'int * bitmap [5];' au lieu de 'int bitmap [5];' –

+0

@ willkill07 Désolé pour le code bâclé. Je l'ai édité et il devrait être légal C++ maintenant – Edward

Répondre

-2

Le problème est résolu par le point d'abord initialiser à zéro avant allouer la mémoire, à savoir ajouter bitmap [i] = 0 au début de la boucle. Pas vraiment sûr de savoir comment cela affecte le résultat, mais cela fonctionne.

+0

Il est très improbable que l'initialisation du pointeur soit la cause de tout problème que vous avez eu avec votre code. – einpoklum

+0

@einpoklum, je sais que ça sonne bizarre et ne peut pas être expliqué. Cependant, je n'ai rien fait au pointeur autour du code. Comme indiqué dans la question, j'ai essayé d'allouer et libérer la mémoire dans la même fonction, mais il y a toujours des erreurs lorsque je libère la mémoire (pas d'erreur dans d'autres parties du code). Si quelque chose d'autre ne va pas dans le code, je pense qu'il devrait y avoir des erreurs dans d'autres parties du code. L'erreur ne s'est pas produite si j'ai initialisé le pointeur sur zéro, à la fois sur GTX970 et 1080 avec cuda 7. Je suis également impatient de savoir pourquoi cela se produit. Merci. – Edward