настройка текстуры CUDA 2D «unsigned char» для линейной интерполяции

У меня есть линейный массив без знака символов, представляющих 2D-массив. Я хотел бы поместить его в 2D-текстуру CUDA и выполнить линейную интерполяцию (с плавающей запятой), то есть сделать так, чтобы вызов текстуры извлекал 4 ближайших соседа без знака, внутренне преобразовывал их в float, интерполировал между ними и возвращал полученный результат. значение с плавающей запятой.

У меня возникли трудности с настройкой текстуры и привязкой ее к эталону текстуры. Я прошел справочное руководство и приложения CUDA, но мне просто не повезло.

Ниже приведен исполняемый код для установки и привязки 1) текстуры с плавающей запятой и 2) текстуры без знака. Код с плавающей точкой работает просто отлично. Однако, если вы раскомментируете две прокомментированные строки знака без знака внизу, выдается ошибка «неверный аргумент».

#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;
}

Любая помощь / понимание будет наиболее ценно!

Аарон

Ответы на вопрос(1)

Ваш ответ на вопрос