CUDA cudaMemcpy: invalid argument
Hier ist mein 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;
In der Tat ist es ein Komplexes Programm, das enthalten CUDA-und OpenGL. Wenn ich debug das Programm, schlägt beim laufen in der cudaMemcpy mit dem Fehler Informationen
cudaSafeCall () - Runtime-API-Fehler 11: ungültiges argument.
Tatsächlich, dieses Programm verwandelt sich von einem anderen, ordnungsgemäß laufen kann. Aber in diesem einen, ich zwei Variablen S* d und-S-h[3] in der main-Funktion statt in der Klasse. Was ist mehr seltsam ist, dass ich implementieren Sie diese Klasse Ein in ein kleines Programm, es funktioniert gut.
Und ich habe meine Treiber aktualisiert, Fehler immer noch vorhanden ist.
Könnte jemand mir einen Tipp geben, warum dies passiert und wie es zu lösen. Danke.
Wo ist die Grenze
A a;
? Wird es innerhalb einer Funktion, oder ist Sie global? Wenn es global ist, dann wird der Konstruktor aufgerufen werden kann, bevor Sie über einen gültigen device context (ich bin mir nicht sicher über dieses, aber es ist möglich). Wenn das der Fall ist, dann ist die d-Zeiger übergeben cudaMemcpy wäre ungültig.Können Sie Ihre CUDA-Konfiguration verwenden Sie bitte? Ich kann nicht reproduzieren Sie Ihre Fehler mit einer alten GeForce 9400m und CUDA 5.0 preview.
InformationsquelleAutor TonyLic | 2012-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da der Speicher-Operationen, die in der CUDA-blockieren, machen Sie einen Synchronisierungspunkt. Also andere Fehler, die, wenn nicht überprüft, mit cudaThreadSynchonize, wird scheinen, wie Fehler, die sich auf die Erinnerung ruft.
Also, wenn Sie eine Fehlermeldung erhalten, die auf eine Speicher-operation, versuchen Sie, eine cudaThreadSynchronize, bevor Sie und überprüfen Sie das Ergebnis.
Sicher sein, dass die ersten malloc-Anweisung ausgeführt wird. Wenn es ein problem mit der Initialisierung von CUDA, wie @Harrism zeigen, dann wäre es nicht in dieser Aussage?? Versuchen Sie die printf-Anweisungen und finden Sie die richtige Initialisierungen durchgeführt werden. Ich denke, in der Regel invalid argument Fehler werden generiert, die aufgrund der Verwendung von uninitalized Speicherbereiche.
Schreiben Sie eine printf () auf den Konstruktor zeigt die Adresse des cudaMalloc ' ed Speicherbereich
Versuchen, eine Kopie des Speichers für einen Bereich, der lokal zugeteilt, nämlich bewegen Sie den cudaMalloc oben von cudaMemcopy (nur zum testen).
Glück.
InformationsquelleAutor phoad