我执行了下面的cuda内核,了解纹理提取机制但看起来像A [i] [j]数组中的条目应该由tex2D(tex_ref,j,i)获取这不是反直觉吗?我在这里错过了什么吗?
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);
}
通过将host_array [i] [j]设置为(i-j)来填充数组,并将其复制到device_array,并将相同的数组绑定到texRef,surfRef。
输出如下:
数组:0 0 = 0.000000
数组:1 0 = 1.000000
数组:0 1 = -1.000000
数组:1 1 = 0.000000
纹理:0 0 = 0.000000
纹理:1 0 = -1.000000
纹理:0 1 = 1.000000
纹理:1 1 = 0.000000
从曲面读取返回与获取纹理后返回的值类似的值。
答案 0 :(得分:1)
你对此感到困惑:
printf("\n Array : %d %d = %f",x,y,device_array[x][y]);
^^^^
x纹理尺寸是2D纹理化操作中的水平(即宽度)尺寸。这意味着它有效地在数据数组中选择列。但是,在printf
语句中,您使用x来选择行。
您可能希望阅读实际提供2D纹理示例的the documentation(请注意,“纹理提取”是与“纹理”不同的术语,但我们可以忽略这一区别)。在那里的2D纹理示例中,您将看到首先传递“宽度”尺寸索引(即,作为x),并且第二次传递高度尺寸索引(即,作为y)。
documentation还表示多维纹理操作中纹理尺寸的顺序为 width , height , depth 。
您应该能够通过打印输出中的索引反转来创建可比较的结果:
printf("\n Array : %d %d = %f",x,y,device_array[y][x]);
^^^^