2013-03-14 105 views
2

我正在开发一个小cuda库,被这个烦人的tex ref问题所困住。Cuda cudaGetTextureReference返回“无效的纹理参考”

这是从CUDA C编程指南,Page43〜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

一个字符串作为符号paramater在CUDA 5.0除去 命名的变量的用途。

表示在CUDA Toolkit Reference Manual 5.0,第5.20.2.8节/注。

请不要使用以下:

cudaGetTextureReference(&tref, &texRef); 
+0

香港专业教育学院读了有点太API的一个过时的版本。但是,您提供的代码不会编译。 – Defd 2013-03-14 11:51:28

+0

@Defd ..对不起,正如talonmies指出的那样,代码中有一个错误。 – sgarizvi 2013-03-15 01:13:58

3

直接传递的符号,而不是作为一个字符串。该字符串的样子方法是移除完全CUDA 5.您的纹理查找应写为

cudaGetTextureReference(&tref, &texRef); 
+0

这看起来不友善的C++语法。我得到这个:不存在从“texture ”到“const void *”的合适的转换函数。你能详细解释一下细节吗? – Defd 2013-03-14 11:54:40

+1

@Defd:对不起,发了一个很小的错字。该调用需要引用纹理,而不是其值。如果我实际上没有尝试编译并运行任何我发布的代码,我通常会放弃免责声明。这一次我没有..... – talonmies 2013-03-14 14:13:36

+0

感谢您的快速澄清。不幸的是,stackoverflow只允许我选择一个正确的答案。 sgar91的答案看起来更具规范性。我认为这对于像这样的QA网站来说更好。无论如何,谢谢你的荣誉。 – Defd 2013-03-15 03:39:34