2

我正在开发一个小的 cuda lib,被这个烦人的 tex ref 问题所困扰。

这是 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 Toolkit Reference Manual 5.0的第 5.20.2.8 节/注中说明。

请改为执行以下操作:

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

直接传递符号,而不是作为字符串。字符串查找方法是 API 的弃用版本,已在 CUDA 5 中完全删除。您的纹理查找应写为

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