我在Windows上使用Cuda[4.2]时无法读取纹理。
我的程序读取一个包含所有内核模块的ptx文件。此外,编译过程从Host代码的一个短例程中吐出一个额外的ptx文件。这是.cuh文件和.cu文件,仅包含主机代码:
/////////////// "textureDefs.cuh" file ///////////////////////////////////////////
#ifndef _TEXTUREDEFS_CUH
#define _TEXTUREDEFS_CUH
texture < float, cudaTextureType2D, cudaReadModeElementType> texRefEachRes_1;
texture <float, cudaTextureType2D, cudaReadModeElementType> texRefEachResPrev;
///////////////////////////////////////////////////////////////////////////////
/// myBind.cu
/////////////////////////////////////////////////
#include "cuda.h"
#include "textureDefs.cuh"
extern cudaPitchedPtr gYAllFramesForEachRes[ME_NUM_RES], gPrevYForEachRes[ME_NUM_RES];
//
extern "C" cudaError_t bindTextures(int resNum)
{
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat); // x is 32 bit float
size_t offset;
texRefEachResPrev.addressMode[0] = cudaAddressModeClamp;
texRefEachResPrev.addressMode[1] = cudaAddressModeClamp;
texRefEachResPrev.filterMode = cudaFilterModeLinear;
texRefEachResPrev.normalized = false;
cudaError_t err = cudaBindTexture2D(&offset, &texRefEachResPrev,
(unsigned char *)gPrevYForEachRes[resNum].ptr, &channelDesc,
gPrevYForEachRes[resNum].xsize, gPrevYForEachRes[resNum].ysize,
gPrevYForEachRes[resNum].pitch); // jm bug 1/5
return err;
}
我的内核代码中对tex2d的每次调用都返回值0,但我已经检查了数组中是否存在有效数据。
我想知道我是否也需要加载myBind.ptx,如果需要,如何加载,何时加载,在哪里加载?还是不需要这样?
谢谢你的帮助。
在CUDA 5.0之前,对纹理的所有引用都需要来自同一编译单元,否则您将处理碰巧具有相同名称但位于不同命名空间中的单独纹理。
您可以选择在编译前将所有.ptx代码包含在一个文件中,也可以升级到CUDA 5.0。