【发布时间】:2016-12-16 23:42:12
【问题描述】:
我不是 CUDA 初学者;我编写了一些用于处理雷达数据 (2D) 的 CUDA 方法。我已经阅读了大部分 CUDA 编程指南、CUDA By Example 以及这里的许多帖子(感谢 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 页的底部说“线性纹理过滤只能对配置为返回浮点数据的纹理进行。”
如果返回值是浮点数,我没有问题。但是如何将纹理基于 16 位短片?
This post 用 uchar 演示了 cudaFilterModeLinear,所以它肯定是可能的。不同之处在于代码用于纹理引用,而我需要纹理对象。
【问题讨论】:
标签: cuda