【问题标题】:(How To ?) CUDA Linear Interpolation of Short (16-bit) Texture Object [duplicate](如何?)短(16位)纹理对象的CUDA线性插值[重复]
【发布时间】: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


    【解决方案1】:

    This post 有答案。

    虽然搜索帖子并没有立即明确,因为标题并未表明问题与整体纹素类型有关。

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

    AFAIK 不依赖于 addressMode 或 normalizedCoords 枚举。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多