我不是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,所以肯定一定是可能的。区别在于代码用于纹理参考,而我需要纹理对象。
答案 0 :(得分:2)
This post有答案。
虽然搜索帖子时并不是很清楚,但由于标题并未表明问题与整体纹素类型有关。
具体来说,如果纹素是整数类型,则cudaReadModeNormalizedFloat 必须与cudaFilterModeLinear一起使用。这是“编程指南”中“......配置为返回浮点数据”的隐含含义。 Geez,为什么Nvidia不能明确说明这一点?
AFAIK不依赖于addressMode或normalizedCoords枚举。
编辑:cudaReadModeNormalizedFloat不适用于int32纹素。更一般地说,int32没有硬件插值。