CUDA纹理内存绑定全局内存的一个子部分

CUDA纹理内存绑定全局内存的一个子部分,c,memory,cuda,gpu,textures,C,Memory,Cuda,Gpu,Textures,绑定到纹理内存(全局设备内存的一个子部分)时出现问题 我有一个大的全局设备阵列,内存如下所示: 双*设备_全局 Cudamaloc((无效**)和设备_global,sizeof(双)*N)) cudaMemcpy(设备\全局,主机,大小(双)*N,cudaMemcpyHostToDevice)) 我在for循环中运行许多内核 每个内核都需要一小部分(int offset=100)的device\u global,我通过以下方式将其绑定到纹理: cudaBindTexture(0,texRef,

绑定到纹理内存(全局设备内存的一个子部分)时出现问题

我有一个大的全局设备阵列,内存如下所示:

双*设备_全局

Cudamaloc((无效**)和设备_global,sizeof(双)*N))

cudaMemcpy(设备\全局,主机,大小(双)*N,cudaMemcpyHostToDevice))

我在for循环中运行许多内核

每个内核都需要一小部分(int offset=100)的
device\u global
,我通过以下方式将其绑定到纹理:

cudaBindTexture(0,texRef,设备_全局,channelDesc,sizeof(双)*10)

然而,我面临的问题是,我无法使用指针算法通过循环的偏移量仅绑定
device\u global
的循环部分

我想做一些类似的事情:

cudaBindTexture(0,texRef,设备全局+偏移*i,channelDesc,sizeof(双)*10)

应该注意的是,如果偏移量设置为0,则上述方法确实有效,但指针算法不知何故不起作用


任何帮助或其他指导都将不胜感激。

纹理内存的偏移必须对齐。您不能绑定内存的任何部分,只能绑定正确对齐的部分,这是因为内部高性能硬件是如何工作的

一种解决方案是使用倾斜内存,而不是使用非常小的纹理 有几个大的,每个都从矩阵的一行开始

我在这里猜测,但我认为使用

sizeof(double)*10
作为纹理内存的数据大小,设置内存本身比读取内存需要更多的时间


总矩阵有多大?

我不相信你想做的是可能的。我怀疑有一些幕后地址转换,这意味着如果运行时内存管理器还不知道传递给绑定调用的指针,并且该指针与页面边界对齐,则不允许将纹理绑定到地址


最好将整个数组绑定到纹理,然后将索引偏移量传递到每个内核中,以用于纹理提取。

0
NULL
作为
cudaBindTexture
的第一个参数传递是不好的做法。CUDA纹理绑定要求要绑定的指针必须对齐。对齐要求可通过设备属性确定

cudaBindTexture
可以将任何设备指针绑定到该纹理。如果指针未对齐,它将返回距离
cudaBindTexture
的第一个参数中最近的前一个对齐地址的偏移量(以字节为单位)。如果第一个参数为
NULL
,则函数调用失败

装订应按以下方式进行:

size_t texture_offset = 0;
cudaBindTexture(&texture_offset, texRef, device_global+ offsett * i , channelDesc, sizeof(double)*10);

即使对于设备指针,IIRC指针算法也可以。是否在循环结束时解除了纹理的绑定?错误是什么?为了说明范围,我们假设每个内核的纹理内存大约是2000倍,并且程序需要启动100个内核(因此,
device\u global
的总大小为100*2000)。因此,我希望在每次内核启动时绑定和解除绑定。这也回答了@talonmies的评论。任何其他见解或提示都非常感谢。