0

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 もロードする必要があるかどうか疑問に思っています。そうであれば、どのように、いつ、どこでロードされますか? またはこれは必要ありませんか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

CUDA 5.0 より前では、テクスチャへのすべての参照は同じコンパイル ユニット内からのものである必要がありました。そうしないと、たまたま同じ名前を持つが別の名前空間に存在する別々のテクスチャを扱うことになります。

オプションは、コンパイル前にすべての .ptx コードを 1 つのファイルに含めるか、CUDA 5.0 にアップグレードするかのいずれかです。

于 2013-02-09T22:19:35.570 に答える