当内核代码在PTX文件中时,在Cuda中使用纹理,主机代码也生成PTX文件

时间:2013-02-08 14:53:17

标签: cuda textures gpu ptx

我无法在Windows上使用Cuda [4.2]将纹理读取工作。

我的程序读取包含所有内核模块的ptx文件。此外,编译过程从主机代码的短例程中吐出一个额外的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,如果是这样,它是如何以及何时何地加载的?或者这不是必需的吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在CUDA 5.0之前,对纹理的所有引用都需要来自同一个编译单元,否则你将处理碰巧具有相同名称但位于不同名称空间的单独纹理。

您的选择是在编译之前将所有.ptx代码包含在单个文件中,或升级到CUDA 5.0。