2016-12-28 2 views
0

Ich habe ein Array auf Gerät von großer Länge und für einige Bedingungsprüfung möchte ich (On Host/CPU) nur ein Element aus der Mitte (sagen Nth Element). Was könnte der optimierte Weg dafür sein?Was ist die am besten optimierte Möglichkeit, ein einzelnes Element aus einem Geräte-Array in cuda

Muss ich einen Kernel schreiben, der den N-ten Ort im Array mit einem einzelnen Element aus dem src-Array schreibt und dann ein einzelnes Element-Array in den Host kopiert?

Antwort

1

Sie können ein einzelnes Element eines Arrays mit cudaMemcpy kopieren. Angenommen, Sie N -te Element von Array kopieren möchten:

int * dSourceArray

variable

int hTargetVariable

können Sie Gerät Zeiger arithmetics auf dem Host-Anwendung. Alles, was Sie tun müssen, ist dSourceArray Zeiger durch N Elemente Ameise Kopie einzelnes Element zu bewegen:

cudaMemcpy(&hTargetVariable, dSourceArray+N, sizeof(int), cudaMemcpyDeviceToHost) 

Beachten Sie, dass, wenn Sie mehrere Streams verwenden würden Sie das Gerät vor dem Übertragen der Daten synchronisieren möchte.

+0

Bedeutet dies nicht, dass N dem Host bereits bekannt ist? Was passiert, wenn es nicht ist? – talonmies

+0

Wenn das N irgendwie auf dem Gerät berechnet wird, würde es eine globale __device__ Variable geben. Zuerst würden Sie cudaMemcpyFromSymbol() verwenden, um den Wert von N aus der globalen Variable __device__ zu kopieren und dann das N-the-Element wie oben beschrieben zu kopieren. – pSoLT

Verwandte Themen