настройка текстуры 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;
}
Любая помощь / понимание будет наиболее ценно!
Аарон