绑定CUDA纹理读取为零

绑定CUDA纹理读取为零,cuda,2d,textures,Cuda,2d,Textures,我尝试从纹理中读取值,然后将它们写回全局内存。 我确信编写部分是有效的,因为我可以在内核中放入常量值,并且可以在输出中看到它们: __global__ void bartureKernel( float* g_odata, int width, int height) { unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; unsigned int y = blockIdx.y*blockDim.y + threadIdx

我尝试从纹理中读取值,然后将它们写回全局内存。 我确信编写部分是有效的,因为我可以在内核中放入常量值,并且可以在输出中看到它们:

__global__ void
bartureKernel( float* g_odata, int width, int height) 
{
    unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
    unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;

    if(x < width && y < height) {
            unsigned int idx = (y*width + x);
            g_odata[idx] = tex2D(texGrad, (float)x, (float)y).x;

    }
}
全局无效
bartureKernel(浮点*g_odata,整数宽度,整数高度)
{
无符号整数x=blockIdx.x*blockDim.x+threadIdx.x;
无符号整数y=blockIdx.y*blockDim.y+threadIdx.y;
如果(x<宽度和y<高度){
无符号整数idx=(y*宽度+x);
g_odata[idx]=tex2D(texGrad,(float)x,(float)y).x;
}
}
我要使用的纹理是具有两个通道的2D浮动纹理,因此我将其定义为:

texture<float2, 2, cudaReadModeElementType> texGrad;
textgrad纹理;
调用内核的代码用一些恒定的非零值初始化纹理:

float* d_data_grad = NULL;

cudaMalloc((void**) &d_data_grad, gradientSize * sizeof(float));
CHECK_CUDA_ERROR;

texGrad.addressMode[0] = cudaAddressModeClamp;
texGrad.addressMode[1] = cudaAddressModeClamp;
texGrad.filterMode = cudaFilterModeLinear;
texGrad.normalized = false;

cudaMemset(d_data_grad, 50, gradientSize * sizeof(float));
CHECK_CUDA_ERROR;

cudaBindTexture(NULL, texGrad, d_data_grad, cudaCreateChannelDesc<float2>(), gradientSize * sizeof(float));

float* d_data_barture = NULL;
cudaMalloc((void**) &d_data_barture, outputSize * sizeof(float));
CHECK_CUDA_ERROR;

dim3 dimBlock(8, 8, 1);
dim3 dimGrid( ((width-1) / dimBlock.x)+1, ((height-1) / dimBlock.y)+1, 1);

bartureKernel<<< dimGrid, dimBlock, 0 >>>( d_data_barture, width, height);
float*d_data_grad=NULL;
Cudamaloc((无效**)和d_数据_梯度,梯度大小*大小(浮动));
检查_CUDA_错误;
texGrad.addressMode[0]=cudaAddressModeClamp;
texGrad.addressMode[1]=cudaAddressModeClamp;
texGrad.filterMode=cudaFilterModeLinear;
texGrad.normalized=false;
cudaMemset(d_数据_梯度,50,梯度大小*大小(浮动));
检查_CUDA_错误;
cudaBindTexture(NULL,texGrad,d_data_grad,cudaCreateChannelDesc(),gradientSize*sizeof(float));
float*d_data_barture=NULL;
cudamaloc((void**)和d_data_barture,outputSize*sizeof(float));
检查_CUDA_错误;
dim3 dimBlock(8,8,1);
dim3 dimGrid((宽度-1)/dimBlock.x)+1、((高度-1)/dimBlock.y)+1,1);
bartureKernel>(数据、宽度、高度);
我知道,将纹理字节设置为所有“50”在浮点上下文中没有多大意义,但它至少应该给我一些非零值来读取


但是我只能读取零…

您正在使用
cudaBindTexture
将您的纹理绑定到
cudamaloc
分配的内存。在内核中,您使用
tex2D
函数从纹理中读取值。这就是它读取零的原因

如果使用
cudaBindTexture
将纹理绑定到线性内存,则将使用内核内的
tex1Dfetch
读取纹理

tex2D
用于使用函数
cudaBindTexture2D
仅读取绑定到基音线性内存的纹理(由
cudamallocitch
分配),或使用函数
cudaBindTexture2D
读取绑定到cudaArray的纹理

以下是基本表格,您可以从编程指南中阅读:

内存类型--------------使用--------------绑定分配--------------使用--------------------------在内核中读取

线性存储器…………
cudamaloc
………
cudaBindTexture
……
tex1Dfetch

基音线性存储器………
cudamallocitch
cudabindture2d
tex2D

cudaArray………
cudamalocarray
cudaBindTextureToArray…
tex1D
tex2D


3D cudaArray……
cudaMalloc3DArray
cudaBindTextureToArray
tex3D
要添加,使用Tex1Fetch的访问基于整数索引。 但是,其余的是基于浮点的索引,您必须添加+0.5才能获得所需的精确值

我很好奇为什么要创建float并绑定到float2纹理?它可能给出不明确的结果。 float2不是二维浮动纹理。它实际上可以用来表示复数

typedef struct {float x; float y;} float2;
我认为本教程将帮助您了解如何在cuda中使用纹理内存。


您展示的内核并没有从使用纹理中获得太多好处。然而,如果使用得当,通过利用局部性,纹理内存可以大大提高性能。此外,它对插值也很有用。

在何处以及如何显示作为零的值?