2016-07-18 6 views
1

Ich führte folgenden Cuda Kernel, um die Textur Abrufmechanismus zu verstehen, aber sieht aus wie A [i] [j] th Eintrag in Array sollte von tex2D abgerufen werden (tex_ref, j, i) Ist das nicht kontraintuitiv? Fehle ich hier etwas?Verständnis Textur holen in CUDA

texture<float, cudaTextureType2D, cudaReadModeElementType> texRef; 
surface<void,cudaSurfaceType2D> surfRef; 

__global__ void transformKernel(float device_array[3][3], 
           int width, int height, 
           float theta) 
{ 
    unsigned int x = blockIdx.x * blockDim.x + threadIdx.x; 
    unsigned int y = blockIdx.y * blockDim.y + threadIdx.y; 
    printf("\n Array : %d %d = %f",x,y,device_array[x][y]); 
    printf("\n Texture : %d %d = %f",x,y,tex2D(texRef,x,y)); 
    float temp; 
    surf2Dread(&temp, surfRef, x*sizeof(float),y); 
    printf("\n Surface : %d %d = %f",x,y,temp); 

} 

Array wird durch die Einstellung host_array [i] [j], um (i-j) besetzt, und wurde zu texRef, surfRef gebunden device_array und demselben Array kopiert.

Die Ausgabe sieht so aus:

Array: 0 0 = 0.000000

Array: 1 0 = 1.000000

Array: 0 1 = -1.000000

Array: 1 1 = 0.000000

Textur: 0 0 = 0,000000

Beschaffenheit: 1 0 = -1,000000

Beschaffenheit: 0 1 = 1,000000

Beschaffenheit: 1 1 = 0,000000

Liest aus Oberflächen Ähnliche Werte zurückgibt, wie die Textur nach Abrufen zurückgegeben.

Antwort

1

Sie werden durch diese verwirrt:

printf("\n Array : %d %d = %f",x,y,device_array[x][y]); 
               ^^^^ 

Die x Textur Dimension der horizontal ist (das heißt Breite) Dimension in einem 2D-Texturierung Betrieb. Das bedeutet, dass effektiv eine Spalte im Datenarray ausgewählt wird. In Ihrer printf-Anweisung verwenden Sie jedoch x, um eine Zeile auszuwählen.

Vielleicht möchten Sie the documentation lesen, die tatsächlich ein Beispiel für 2D-Texturierung gibt (beachten Sie, dass "Textur abrufen" ist ein eindeutiger Begriff von "Texturierung", aber wir können diese Unterscheidung hier ignorieren). In dem 2D-Texturbeispiel dort werden Sie sehen, dass der Dimensionsindex "Breite" zuerst passiert wird (d. H. Als x) und der Index der Höhendimension als zweites übergeben wird (d. H. Als y).

Die documentation zeigt auch, dass die Reihenfolge der Textur Dimensionen in einem mehrdimensionalen Texturiervorgang ist Breite, Höhe, Tiefe.

printf("\n Array : %d %d = %f",x,y,device_array[y][x]); 
               ^^^^ 
+0

Dank dafür:

Sie sollten vergleichbare Ergebnisse mit einer Auflösung von Indizes auf Ihrem Ausdruck erstellen können! – Abhishek