如何在CUDA中使用Textures数组

时间:2015-07-20 15:46:01

标签: cuda gpu

我试图在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;
}

1 个答案:

答案 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;,并且要注意纹理引用是在文件范围内声明的。

您可以使用预处理器宏来改进我的代码片段...