理解CUDA中的纹理提取

理解CUDA中的纹理提取,cuda,Cuda,为了理解纹理获取机制,我执行了cuda内核,但看起来数组中的第[I][j]个条目应该由tex2D(tex_ref,j,I)获取,这不是很直观吗?我有什么遗漏吗 texture<float, cudaTextureType2D, cudaReadModeElementType> texRef; surface<void,cudaSurfaceType2D> surfRef; __global__ void transformKernel(float device_ar

为了理解纹理获取机制,我执行了cuda内核,但看起来数组中的第[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);

}
纹理texRef;
表面粗糙度;
__全局无效转换内核(浮点设备数组[3][3],
整数宽度,整数高度,
浮点数(θ)
{
无符号整数x=blockIdx.x*blockDim.x+threadIdx.x;
无符号整数y=blockIdx.y*blockDim.y+threadIdx.y;
printf(“\n数组:%d%d=%f”,x,y,设备_数组[x][y]);
printf(“\n纹理:%d%d=%f”,x,y,tex2D(texRef,x,y));
浮子温度;
surf2Dread(&temp,surfRef,x*sizeof(浮动),y);
printf(“\n表面:%d%d=%f”,x,y,temp);
}
通过将主机_数组[i][j]设置为(i-j)来填充数组,并将其复制到设备_数组,同时将同一数组绑定到texRef、surfRef

输出如下所示:

数组:0=0.000000

数组:1 0=1.000000

数组:0 1=-1.000000

数组:11=0.000000

纹理:0=0.000000

纹理:10=-1.000000

纹理:0 1=1.000000

纹理:11=0.000000


从曲面读取返回的值与获取纹理后返回的值相似

你被这一点弄糊涂了:

printf("\n  Array : %d %d = %f",x,y,device_array[x][y]);
                                                 ^^^^
x纹理维度是2D纹理操作中的水平(即宽度)维度。这意味着它有效地选择了数据数组中的一列。但是,在
printf
语句中,您使用的是x来选择一行

您可能希望阅读其中实际给出的2D纹理示例(请注意,“纹理获取”是与“纹理”不同的术语,但我们可以忽略这一区别)。在那里的2D纹理示例中,您将看到“宽度”标注索引首先传递(即x),高度标注索引第二次传递(即y)

还指示多维纹理操作中纹理尺寸的顺序为宽度、高度和深度

您应该能够通过在打印输出上反转索引来创建可比较的结果:

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