2013-03-14 66 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