我有一個代表二維數組的無符號字符的線性數組。我想將它放到CUDA 2D紋理中,並對其進行(浮點)線性插值,即紋理調用獲取4個最近的無符號char鄰居,在內部將它們轉換爲浮點,在它們之間進行插值並返回結果浮點值。設置用於線性插值的CUDA 2D「無符號字符」紋理
我有一些困難設置紋理並將其綁定到紋理參考。我已經通過CUDA參考手冊&附錄,但我只是沒有任何運氣。
下面是可運行代碼,用於設置和綁定1)浮點紋理和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;
}
任何幫助/見解將不勝感激!
Aaron
紋理的每一行必須被適當地對準。如果將紋理綁定到普通數組(而不是CUDA數組),通常無法保證。要將純內存綁定到2D紋理,您需要使用cudaMallocPitch()分配內存。這將行間距設置爲適合綁定到紋理。請注意,將'0'作爲第一個參數傳遞給紋理綁定API調用是不好的做法。該參數用於CUDA嚮應用程序返回偏移量。如果偏移量不爲零,則需要在紋理訪問期間將其添加到紋理座標。 – njuffa