(如何?)CUDA短(16位)纹理对象的线性插值

时间:2016-12-16 10:58:19

标签: cuda

我不是CUDA初学者;我已经编写了一些用于处理雷达数据(2D)的CUDA方法。我已经阅读了大部分CUDA编程指南,CUDA示例以及此处的大量帖子(谢谢stackoverflow贡献者)。

我主要使用音调线性内存。我最近进入了纹理,并享受了加速。

我的问题是:如何让cudaFilterModeLinear基于带符号的16位短片来处理纹理对象?

最小可重现代码:

#include <helper_cuda.h> // checkCudaErrors

int main(int argc, char * argv[]){

const unsigned int Nr = 4096;
const unsigned int Na = 1024;

void * ptr;
size_t pitch;
const size_t width  = Nr*sizeof( short );
const size_t height = Na;

checkCudaErrors( cudaMallocPitch( &ptr, &pitch, width, height) );

struct cudaResourceDesc resDesc;
struct cudaTextureDesc texDesc;
cudaTextureObject_t FrameTex;

memset( &resDesc, 0, sizeof(resDesc) );
resDesc.resType = cudaResourceTypePitch2D;
//resDesc.res.pitch2D.desc = cudaCreateChannelDesc<float>();
resDesc.res.pitch2D.desc = cudaCreateChannelDesc<short>();

resDesc.res.pitch2D.devPtr       = ptr;
resDesc.res.pitch2D.pitchInBytes = pitch;
resDesc.res.pitch2D.width        = width;
resDesc.res.pitch2D.height       = height;

// Specify texture object parameters
memset( &texDesc, 0, sizeof(texDesc) );
texDesc.addressMode[0] = cudaAddressModeClamp;
texDesc.addressMode[1] = cudaAddressModeClamp;
// filter modes: Point, Linear
texDesc.filterMode     = cudaFilterModeLinear;
// read modes: NormalizedFloat, ElementType
texDesc.readMode       = cudaReadModeElementType;
texDesc.normalizedCoords = 0;

// Create texture object
checkCudaErrors( cudaCreateTextureObject( &FrameTex, &resDesc, &texDesc, NULL ));

cudaDeviceReset();
return 0;
}

这将抛出

 CUDA error at ... code=26(cudaErrorInvalidFilterSetting) "cudaCreateTextureObject( &FrameTex, &resDesc, &texDesc, NULL )" 

CUDA Programming Guide v8.0第42页的底部说&#34;线性纹理过滤只能用于配置为返回浮点数据的纹理。&#34; < / p>

如果返回值是浮点数,我没有问题。但是如何将纹理基于16位短路?

This post使用uchar演示cudaFilterModeLinear,所以肯定一定是可能的。区别在于代码用于纹理参考,而我需要纹理对象。

1 个答案:

答案 0 :(得分:2)

This post有答案。

虽然搜索帖子时并不是很清楚,但由于标题并未表明问题与整体纹素类型有关。

具体来说,如果纹素是整数类型,则cudaReadModeNormalizedFloat 必须与cudaFilterModeLinear一起使用。这是“编程指南”中“......配置为返回浮点数据”的隐含含义。 Geez,为什么Nvidia不能明确说明这一点?

AFAIK不依赖于addressMode或normalizedCoords枚举。

编辑:cudaReadModeNormalizedFloat不适用于int32纹素。更一般地说,int32没有硬件插值。