了解CUDA中的纹理提取

时间:2016-07-18 17:07:01

标签: cuda

我执行了下面的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

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

1 个答案:

答案 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]);
                                                 ^^^^