2015-07-20 78 views
1

我試圖在CUDA中使用紋理數組,但是出現「無效紋理參考」錯誤。任何人都有任何想法如何實現紋理數組?如何在CUDA中使用紋理數組

#include<iostream> 
#include<cstdio> 
#include<cstdlib> 

#define MAX_TEXTURE 134217728 
#define MAX_LENGTH 268435456 

using namespace std; 

texture<char, 1, cudaReadModeElementType> texref[2]; 

int main(){ 
// host variable 
char *text; 
// device variable 
char *dev_a; 

text = (char*)malloc(MAX_LENGTH*sizeof(char)); 

// any initial value 
for(int i=0; i<MAX_LENGTH; i++) 
    text[i] = 'a'; 

cudaMalloc((void**)&dev_a, MAX_LENGTH*sizeof(char)); 
cudaMemcpy(dev_a, text, MAX_LENGTH*sizeof(char), cudaMemcpyHostToDevice); 

cudaError_t err = cudaBindTexture(0, texref[0], dev_a, MAX_TEXTURE*sizeof(char)); 
cout << cudaGetErrorString(err) << endl; 

size_t offset = MAX_TEXTURE; 
err = cudaBindTexture(&offset, texref[1], dev_a, MAX_TEXTURE*sizeof(char)); 
cout << cudaGetErrorString(err) << endl; 


cudaFree(dev_a); 
free(text); 
return 0; 
} 

回答

4

這是不可能的。

如果您可以使用(開普勒或麥克斯韋gpu和cuda 5.0或更高版本),您應該嘗試texture objects (bindless textures)

在我的代碼我僞造了陣列使用函數訪問與類似以下內容的各種紋理參考(在頭文件):據我所知

texture<char, 1, cudaReadModeElementType> tex0; 
texture<char, 1, cudaReadModeElementType> tex1; 
// ... 

texture<char, 1, cudaReadModeElementType> getTexture(int id) 
{ 
    if(id == 0) 
     return tex0; 
    else if(id == 1) 
     return tex1; 
    // ... 
} 

沒有辦法避免明確列出所有texture<char, 1, cudaReadModeElementType> texX;,並注意紋理引用是在文件範圍內聲明的。

也許你可以通過使用預處理器宏改善我的代碼片段...

+0

我用了這個問題之前,多變量的引用,但它使得它如此的醜陋和不靈活(一個新的變量,需要每次紋理參考2^27元素)。我使用費米架構,我認爲它可以有一個更優雅的解決方案。謝謝。 –

+0

是的,它很醜。但是,您可以將該代碼放在一個頭文件中,如果您提供訪問它們的好方法,則不需要再次查看它。例如,你可以提供像'bindNextRef()'這樣的函數來跟蹤哪些引用已經被使用,以及其他類似的東西...... – havogt