J'essaie de lire les valeurs d'une texture et de les réécrire dans la mémoire globale. Je suis sûr que la partie d'écriture fonctionne, beause je peux mettre des valeurs constantes dans le noyau et je peux les voir dans la sortie:La texture CUDA lue lit zéro
__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;
}
}
La texture Je veux utiliser est une texture flottante 2D avec deux canaux, donc je définissais comme:
texture<float2, 2, cudaReadModeElementType> texGrad;
Et le code qui appelle le noyau initialise la texture avec des valeurs non nulles constantes:
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);
Je sais, la mise en t Exposer des octets à tout "50" n'a pas beaucoup de sens dans le contexte des flottants, mais il devrait au moins me donner des valeurs non nulles à lire.
Je ne peux lire que des zéros ...
Où et comment affichez-vous les valeurs qui apparaissent sous forme de zéros? – talonmies