Configuración de una textura CUDA 2D "unsigned char" para interpolación lineal

Tengo una matriz lineal de caracteres sin firmar que representan una matriz 2D. Me gustaría colocarlo en una textura CUDA 2D y realizar una interpolación lineal (punto flotante), es decir, hacer que la llamada de la textura recoja a los 4 vecinos más cercanos sin signo, convertirlos internamente a flotar, interpolar entre ellos y devolver el resultado Valor de punto flotante.

Tengo algunas dificultades para configurar la textura y vincularla a una referencia de textura. He revisado el manual de referencia y los apéndices de CUDA, pero no estoy teniendo suerte.

A continuación se muestra el código ejecutable para configurar y enlazar 1) una textura de punto flotante y 2) una textura de charla sin firma. El código de punto flotante corre muy bien. Sin embargo, si elimina los comentarios de las dos líneas de caracteres sin signo comentadas hacia la parte inferior, se produce un error de "argumento no válido".

#include <cstdio>
#include <cuda_runtime.h>

typedef unsigned char uchar;

// Define (global) texture references; must use "cudaReadModeNormalizedFloat"
// for ordinal textures
texture<float, cudaTextureType2D, cudaReadModeNormalizedFloat> texRefFloat;
texture<uchar, cudaTextureType2D, cudaReadModeNormalizedFloat> texRefUChar;

// Define size of (row major) textures
size_t const WIDTH  = 1000;
size_t const HEIGHT = 1000;
size_t const TOT_PIX = WIDTH*HEIGHT;

int main(void)
{
   // Set texel formats
   cudaChannelFormatDesc descFloat = cudaCreateChannelDesc<float>();
   cudaChannelFormatDesc descUChar = cudaCreateChannelDesc<uchar>();

   // Choose to perform texture 2D linear interpolation
   texRefFloat.filterMode = cudaFilterModeLinear;
   texRefUChar.filterMode = cudaFilterModeLinear;

   // Allocate texture device memory
   float * d_buffFloat; cudaMalloc(&d_buffFloat, sizeof(float)*TOT_PIX);
   uchar * d_buffUChar; cudaMalloc(&d_buffUChar, sizeof(uchar)*TOT_PIX);

   // Bind texture references to textures
   cudaError_t errFloat = cudaSuccess;
   cudaError_t errUChar = cudaSuccess;

   errFloat = cudaBindTexture2D(0, texRefFloat, d_buffFloat, descFloat,
                  WIDTH, HEIGHT, sizeof(float)*WIDTH);
   // Uncomment the following two lines for an error
   //errUChar = cudaBindTexture2D(0, texRefUChar, d_buffUChar, descUChar,
   //               WIDTH, HEIGHT, sizeof(uchar)*WIDTH);

   // Check for errors during binding
   if (errFloat != cudaSuccess)
   {
      printf("Error binding float texture reference: %s\n",
          cudaGetErrorString(errFloat));
      exit(-1);
   }

   if (errUChar != cudaSuccess)
   {
      printf("Error binding unsigned char texture reference: %s\n",
          cudaGetErrorString(errUChar));
      exit(-1);
   }

   return 0;
}

Cualquier ayuda / conocimiento sería muy apreciado!

Aaron

Respuestas a la pregunta(1)

Su respuesta a la pregunta