Memory 将纹理内存绑定到GPU分配的矩阵

Memory 将纹理内存绑定到GPU分配的矩阵,memory,matrix,cuda,textures,Memory,Matrix,Cuda,Textures,我在GPU上创建了一个大小为(p7P_NXSTATES)x(p7P_NXTRANS)的浮点矩阵,如下所示: //特殊转换 //指向设备指针数组的主机指针 浮动**tmp_xsc=(浮动**)(malloc(p7P_NXSTATES*sizeof(浮动*)); //对于计分档案中的每个字母表。。。 对于(i=0;i

我在GPU上创建了一个大小为(p7P_NXSTATES)x(p7P_NXTRANS)的浮点矩阵,如下所示:

//特殊转换
//指向设备指针数组的主机指针
浮动**tmp_xsc=(浮动**)(malloc(p7P_NXSTATES*sizeof(浮动*));
//对于计分档案中的每个字母表。。。
对于(i=0;i
该内存一旦复制到GPU,就永远不会更改,只能从中读取。因此,我决定将其绑定到纹理内存。问题是,当使用2D纹理内存时,绑定到它的内存实际上只是一个使用偏移作为矩阵的数组

我知道我需要使用cudaBindTexture2D()和cudaCreateChannelDesc()来绑定这个2D内存,这样才能访问它

tex2D(texXSC,x,y)


--但我只是不知道怎么做。有什么想法吗?

简单的回答是,不能将指针数组绑定到纹理。您可以创建CUDA阵列并将数据从线性源内存复制到该阵列,也可以使用直接绑定到纹理的倾斜线性内存。但是一组指针是行不通的。

该死,我想这也行。我可以通过将代码隐藏在单个宏后面来简化代码,就像我在1D纹理内存中所做的那样。我可以举一个例子来说明如何在上面的代码中使用你提到的这个函数。重复我的回答:你不能在你的代码中使用我提到的任何东西,因为你的代码正在分配设备指针数组,而这些数组不能用于任何类型的纹理操作。
// Special Transitions
// Host pointer to array of device pointers
float **tmp_xsc = (float**)(malloc(p7P_NXSTATES * sizeof(float*)));
// For every alphabet in scoring profile...
for(i = 0; i < p7P_NXSTATES; i++)
{
    // Allocate memory for device for every alphabet letter in protein sequence
    cudaMalloc((void**)&(tmp_xsc[i]), p7P_NXTRANS * sizeof(float));
    // Copy over arrays
    cudaMemcpy(tmp_xsc[i], gm.xsc[i], p7P_NXTRANS * sizeof(float), cudaMemcpyHostToDevice);
}
// Copy device pointers to array of device pointers on GPU (matrix)
float **dev_xsc;
cudaMalloc((void***)&dev_xsc, p7P_NXSTATES * sizeof(float*));
cudaMemcpy(dev_xsc, tmp_xsc, p7P_NXSTATES * sizeof(float*), cudaMemcpyHostToDevice);