CUDA cudaMemcpy: invalid argument
Voici mon code:
struct S {
int a, b;
float c, d;
};
class A {
private:
S* d;
S h[3];
public:
A() {
cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
}
void Init();
};
void A::Init() {
for (int i=0;i<3;i++) {
h[i].a = 0;
h[i].b = 1;
h[i].c = 2;
h[i].d = 3;
}
cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice));
}
A a;
En fait c'est un programme complexe qui contiennent CUDA et OpenGL. Quand je debug de ce programme, il échoue lors de l'exécution de cudaMemcpy avec les informations d'erreur
cudaSafeCall() Runtime erreur de l'API 11: argument non valide.
En fait, ce programme est transformé à partir d'un autre, qui peut s'exécuter correctement. Mais dans celui-ci, j'ai utilisé deux variables S* d et S h[3] dans la fonction principale au lieu de la classe. Ce qui est plus bizarre, c'est que je mettre en œuvre cette classe dans un petit programme, il fonctionne très bien.
Et j'ai mis à jour mon pilote, l'erreur est toujours présente.
Quelqu'un pourrait-il me donner un indice sur le pourquoi cela arrive et comment le résoudre. Merci.
Où est la ligne
A a;
? Est-il à l'intérieur d'une fonction, ou est-il global? Si c'est mondial, alors que le constructeur pourrait être appelée avant que vous avez un contexte de périphérique valide (je ne suis pas sûr à ce sujet, mais c'est possible). Si c'est le cas, alors la d pointeur passé à cudaMemcpy serait invalide.Vous pouvez poster votre CUDA de configuration que vous utilisez s'il vous plaît? Je ne peux pas reproduire l'erreur avec une vieille GeForce 9400m et CUDA 5.0 aperçu.
OriginalL'auteur TonyLic | 2012-05-14
Vous devez vous connecter pour publier un commentaire.
Parce que les opérations de mémoire dans CUDA sont de blocage, ils font un point de synchronisation. Si d'autres erreurs, si ce n'est vérifié avec cudaThreadSynchonize, semblera comme des erreurs sur la mémoire des appels.
Donc, si une erreur est reçu sur une opération de mémoire, essayez de placer un cudaThreadSynchronize avant et vérifier le résultat.
Assurez-vous que le premier malloc instruction est exécutée. Si c'est un problème sur l'initialisation de CUDA, comme @Harrism indiquer, alors il ne pourrait pas, dans cette déclaration?? Essayer de mettre des printf états, et de voir la bonne initialisations sont effectuées. Je pense que généralement argument non valide erreurs sont générés en raison de l'utilisation de uninitalized zones de mémoire.
Écrire un printf de votre constructeur indiquant l'adresse de l'cudaMalloc ed zone de mémoire
Essayer de faire une copie de la mémoire pour une zone qui est localement affectées, à savoir déplacer le cudaMalloc-dessus de cudaMemcopy (juste pour le test).
Bonne chance.
OriginalL'auteur phoad