2D 配列を表す unsigned char の線形配列があります。それを CUDA 2D テクスチャに配置し、(浮動小数点) 線形補間を実行したいと考えています。つまり、テクスチャ呼び出しで最も近い 4 つの符号なし char 隣接要素をフェッチし、それらを内部的に float に変換し、それらの間を補間し、結果を返します。浮動小数点値。
テクスチャを設定してテクスチャ参照にバインドするのに苦労しています。私は CUDA のリファレンス マニュアルと付録を読みましたが、うまくいきません。
以下は、1) 浮動小数点テクスチャと 2) unsigned char テクスチャをセットアップしてバインドするための実行可能なコードです。浮動小数点コードは問題なく実行されます。ただし、下部に向かってコメント化された 2 つの unsigned char 行のコメントを解除すると、「引数が無効です」というエラーがスローされます。
#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;
}
どんな助け/洞察も大歓迎です!
アーロン