绑定的CUDA纹理读数为零

Phi*_*p F 5 textures cuda 2d

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

__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;

    }
}
Run Code Online (Sandbox Code Playgroud)

我想要使​​用的纹理是具有两个通道的2D浮动纹理,因此我将其定义为:

texture<float2, 2, cudaReadModeElementType> texGrad;
Run Code Online (Sandbox Code Playgroud)

调用内核的代码使用一些常量非零值初始化纹理:

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);
Run Code Online (Sandbox Code Playgroud)

我知道,将纹理字节设置为全"50"在浮点数的上下文中没有多大意义,但它至少应该给我一些非零值来读取.

我只能读零...

sga*_*zvi 7

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

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

tex2D用于只从被绑定到这些纹理读取间距线性存储器(其由分配cudaMallocPitch使用功能)cudaBindTexture2D,或它们绑定到这些纹理cudaArray使用功能cudaBindTextureToArray

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

内存类型 ----------------- 分配使用 ----------------- 绑定使用 ---------- ------------- 读入内核

线性记忆................... cudaMalloc........................ cudaBindTexture..... ........................tex1Dfetch

音高线性记忆......... cudaMallocPitch............. cudaBindTexture2D........................tex2D

cudaArray ............................ cudaMallocArray............. cudaBindTextureToArray........ ..... tex1Dtex2D

3D cudaArray ...................... cudaMalloc3DArray........ cudaBindTextureToArray.............tex3D