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.

Par ailleurs, la cudaMemcpy sera reture cudaErrorInvalidValue.
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