2

この厄介なtex refの問題に悩まされている小さなcuda libを開発しています。

これは、Cuda C プログラミング ガイドの 43 ~ 44 ページのサンプル コードです。

texture<float, cudaTextureType2D,cudaReadModeElementType> texRef;
textureReference* texRefPtr;
cudaGetTextureReference(&texRefPtr, "texRef");
cudaChannelFormatDesc channelDesc;
cudaGetChannelDesc(&channelDesc, cuArray);
cudaBindTextureToArray(texRef, cuArray, &channelDesc);

実行すると、行 cudaGetTextureReference(...) がエラー コードを返しますcudaErrorInvalidTexture。インターネット上で cudaGetTextureReference に関する他の多くのサンプルを見つけることができませんでした。それらのほとんどは、上記のサンプル コードとまったく同じ手順に従っています。

イライラしたので、後で高レベルの API を試しました。

texture<float, cudaTextureType2D,cudaReadModeElementType> texRef;
cudaBindTextureToArray(texRef, cuArray);

同じ問題。カーネルでそのテクスチャから読み取った場合、取得できるのはゼロ値だけです。

私の完全なおもちゃのテスト コード、100% の再現率: (win7、cuda 5.0)

texture<float, cudaTextureType2D, cudaReadModeElementType> texRef;

int main ()
{
    const textureReference *tref = NULL;
    checkSuccess( cudaGetTextureReference( &tref, "texRef" ) );
    pauseConsole();
    return 0;
}

この問題についての洞察をいただければ幸いです。ありがとう

4

2 に答える 2

5

CUDA 5.0 では、シンボル パラメーターとして変数に名前を付ける文字列の使用が削除されました。

CUDA ツールキット リファレンス マニュアル 5.0のセクション 5.20.2.8 /注に記載されています。

代わりに次の操作を行います。

cudaGetTextureReference( &tref, &texRef );
于 2013-03-14T08:30:48.533 に答える
3

文字列としてではなく、シンボルを直接渡します。文字列ルック メソッドは、CUDA 5 で完全に削除された非推奨バージョンの API です。テクスチャ ルックアップは次のように記述する必要があります。

cudaGetTextureReference( &tref, &texRef );
于 2013-03-14T08:31:31.790 に答える