【问题标题】:Binding texture memory to a GPU allocated matrix将纹理内存绑定到 GPU 分配的矩阵
【发布时间】:2011-10-16 18:33:00
【问题描述】:

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

// 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);

这个内存一旦被复制到 GPU 上,就永远不会改变,只能从中读取。因此,我决定将其绑定到纹理内存。问题是在使用 2D 纹理内存时,绑定到它的内存实际上只是一个使用偏移量作为矩阵起作用的数组。

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

tex2D(texXSC,x,y)

-- 但我只是不确定如何。有什么想法吗?

【问题讨论】:

    标签: memory matrix cuda textures


    【解决方案1】:

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

    【讨论】:

    • 该死,我想这也行得通。我可以通过将代码隐藏在单个宏后面来简化代码,就像对一维纹理内存所做的那样。任何机会我都可以得到一个例子来说明如何使用你在上面的代码中提到的这个函数。
    • 重复我的回答:您不能在代码中使用我提到的任何内容,因为您的代码正在分配设备指针数组,而这些不能用于任何类型的纹理操作。
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2021-04-03
    • 2021-10-05
    • 2021-12-19
    相关资源
    最近更新 更多