我试图在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;
}
答案 0 :(得分:4)
这是不可能的。
如果您(Kepler或Maxwell 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;
,并且要注意纹理引用是在文件范围内声明的。
您可以使用预处理器宏来改进我的代码片段...