CUDA-device-pointer-manipulation
Habe ich verwendet:
float *devptr;
//...
cudaMalloc(&devptr, sizeofarray);
cudaMemcpy(devptr, hostptr, sizeofarray, cudaMemcpyHostToDevice);
in CUDA C zu reservieren und füllen eines Arrays.
Jetzt bin ich versucht, führen Sie einen cuda-kernel, z.B.:
__global__ void kernelname(float *ptr)
{
//...
}
in diesem array aber mit einem offset-Wert.
In C/C++ wäre es etwas wie dieses:
kernelname<<<dimGrid, dimBlock>>>(devptr+offset);
Jedoch, dies scheint nicht zu funktionieren.
Gibt es eine Möglichkeit, dies zu tun, ohne das senden der offset-Wert ein, um den kernel in einem separaten argument und verwenden Sie, dass der offset in den kernel-code?
Irgendwelche Ideen auf, wie dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zeiger-Arithmetik funktioniert nur fine in CUDA. Sie können hinzufügen, ein offset zu einem CUDA-Zeiger in host-code, und es funktioniert (wir erinnern uns, der offset ist nicht byte-offset, es ist ein schlichtes Wort oder element offset).
EDIT: EIN einfaches Beispiel:
Hier können Sie sehen, ein Wort/element offset angewendet wurde, um das Gerät Zeiger in der zweiten
cudaMemcpy
rufen Sie zum starten der Kopie aus dem zweiten Wort, nicht das erste.Zeiger-Arithmetik funktioniert auf dem host-code, den es benutzt, ziemlich oft in den Beispiel-code von nvidia.
"Linearen Speicher vorhanden ist auf dem Gerät in ein 40-bit-Adressraum, also separat zugewiesenen Personen verweisen können, die untereinander über Zeiger, zum Beispiel in einem binären Baum."
Lesen Sie mehr unter: http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#ixzz4KialMz00
Und von der performance primitives (npp) - Dokumentation-ein perfektes Beispiel für Zeiger-Arithmetik.
"4.5.1 Auswählen-Kanal-Quelle-Bild-Zeiger
Dies ist ein Zeiger auf die Kanal-of-interest innerhalb der ersten pixel des Bildes. E. g. wenn pSrc ist die
Zeiger auf das erste pixel innerhalb der ROI eines drei-Kanal-Bild. Mit den entsprechenden select-Kanal kopieren
primitiv könnte man kopieren, den zweiten Kanal dieser Quelle Bild in den ersten Kanal des Ziel -
image gegeben, indem pDst durch Verrechnung der Zeiger um eins:
nppiCopy_8u_C3CR(pSrc + 1, nSrcStep, pDst, nDstStep, oSizeROI);"
*Hinweis: dies funktioniert ohne Multiplikation mit der Anzahl der bytes pro Daten-element, da der compiler ist sich der Datentyp des Zeigers, und berechnet die Adresse entsprechend.
In C und C++, Zeiger-Arithmetik durchgeführt werden kann, wie oben oder durch die notation &ptr[offset] (Rückkehr Gerät Speicheradresse von Daten statt von Wert, der Wert wird nicht auf den Geräte-Speicher von host-code). Bei der Verwendung von entweder-notation die Größe des Datentyps wird automatisch verarbeitet, und die Verschiebung wird angegeben als Anzahl der Daten-Elemente eher als bytes.