Kopieren Sie ein Objekt zu Gerät?
Kann ich kopieren Sie eine C++ - Objekt auf dem Gerät?
sagen, ich habe:
class CudaClass
{
public:
int* data;
CudaClass(int x) {
data = new int[1]; data[0] = x;
}
};
__global__ void useClass(CudaClass cudaClass)
{
printf("%d" cudaClass.data[0]);
};
int main()
{
CudaClass c(1);
}
Nun, wie kopiere ich mit "c" device memory " und starten Sie die kernel - "useClass"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können ein Objekt kopieren, um das Gerät für die Verwendung auf dem Gerät. Wenn das Objekt eingebettet hat Zeiger auf dynamisch zugewiesenen Regionen, der Prozess erfordert einige zusätzliche Schritte.
Sehen meine Antwort hier für eine Diskussion dessen, was beteiligt ist. Die Antwort hat auch noch ein paar Proben-code Antworten verknüpft.
Auch, in Ihrer Klasse definition, wenn Sie möchten, dass bestimmte Funktionen, die verwendet werden auf dem Gerät, sollten Sie schmücken diese Funktionen angemessen (d.h. wahrscheinlich mit
__device__ __host__
);EDIT: In der Antwort auf eine Frage (jetzt gelöscht) hier ist das einfachste Beispiel-code, den ich kommen könnte, basierend auf den gelieferten code:
Im Interesse der Kürze/übersichtlichkeit habe ich darauf verzichtet, die üblichen cuda Fehler überprüfen.
Beantwortung der Frage, können Sie Speicherplatz zuweisen, der direkt von dem host unter Verwendung der Zeiger in der device-Klasse. Dies ist, weil cudaMalloc erwartet ein gewöhnlicher host-based-Zeiger-Speicher, wie das, was du mit:
cudaMalloc können mit einem Zeiger, dessen Speicherung ist bereits auf dem Gerät. Das wird nicht funktionieren:
da es erfordert die Dereferenzierung eines Geräts Zeiger (d_c) in host-code, der nicht erlaubt ist.
data[0]=x;
Sie konnte immer nochcudaMemset
vielleicht, oder etwas wesentlich komplizierter im Konstruktor. Du bist einfach der Zusammenfassung einige der code, den ich geschrieben habe in den Konstruktor, wenn Sie das tun. Live it up.cudaMemcpy(&(d_c->data), &hostdata, sizeof(int *), cudaMemcpyHostToDevice);
warum nicht mitcudaMemcpyDeviceToDevice
? Ich finde beide Zeiger sind auf dem Geräthostdata
enthält einen Zeiger auf device memory. Aber&hostdata
ist ein Zeiger auf eine Stelle in dem host-Speicher. Also Nein, der Zeiger ist nicht "auf das Gerät" und es nicht auf einen Punkt "auf dem Gerät".&hostdata
Punkte auf eine Stelle in dem host-Speicher.hostdata
verweist auf eine Position im Speicher des Gerätes.cudaMemcpy
operation, die Kopien der eigentlichen Daten, also, nach dem kernel, so etwas wie:cudaMemcpy(c.data, hostdata, sizeof(int), cudaMemcpyDeviceToHost);
. Ein komplizierter Gegenstand würde wahrscheinlich erfordern mehrere Schritte. Da eine direkte Kopie des Objekts selbst vom Gerät zurück zum host ungültig machen würden die eingebetteten Zeiger in das Objekt, das Sie einen Weg brauchen würde, zu erhalten oder zu "reparieren" diese Zeiger, viel die gleiche Weise wie diese Antwort zeigt, "reparieren" die embedded-Zeiger in der device-Objekt.