理解CUDA中的纹理提取
为了理解纹理获取机制,我执行了cuda内核,但看起来数组中的第[I][j]个条目应该由tex2D(tex_ref,j,I)获取,这不是很直观吗?我有什么遗漏吗理解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
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]);
^^^^