Eine cudaMemcpy-Operation, die versuchte, einem Klassenmitgliedszeiger auf dem Host einen Wert zuzuweisen, wurde verursacht ein Segmentierungsfehler aufgrund einer falschen Verwendung des Geräts Zeiger.
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float), cudaMemcpyDeviceToHost);
Die Lösung besteht darin, den Gerätezeiger für die Verwendung auf dem Host korrekt einzurichten. Anstatt den Wert des Gerätezeigers direkt auf den Host zu kopieren, ist ein Zwischenzeiger auf dem Host erforderlich.
float * A; cudaMalloc((void**)&A, sizeof(float)); ... ... cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost); CurrentGrid->cdata[i] = new float[size]; cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost);
Gerätezeiger können in cudaMemcpy-Aufrufen auf dem Host nicht direkt dereferenziert werden. Stattdessen muss der Zeigerwert selbst auf einen Zwischenzeiger auf dem Host kopiert werden. Dadurch wird sichergestellt, dass der Host-Zeiger auf einen gültigen Speicherort des Geräts zeigt, an dem auf die Daten zugegriffen werden kann.
Um Speicherlecks zu vermeiden und die ordnungsgemäße Verwendung von Gerätezeigern in cudaMemcpy-Vorgängen sicherzustellen, ist es Es ist wichtig, das richtige Verfahren zum Einrichten von Klassenmitgliedern mit Zeigern auf dem Gerät zu befolgen. Dazu gehört die Verwendung von Zwischenzeigern auf dem Host zum Kopieren von Zeigerwerten und die Verwendung des Hostzeigers für nachfolgende cudaMemcpy-Vorgänge, die den Gerätespeicher betreffen.
Das obige ist der detaillierte Inhalt vonWarum verursacht cudaMemcpy einen Segmentierungsfehler bei der Zuweisung zu einem Klassenmitgliedszeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!