Memory OpenCL:如何将全局内存的连续块复制到私有内存?

Memory OpenCL:如何将全局内存的连续块复制到私有内存?,memory,struct,opencl,memcpy,Memory,Struct,Opencl,Memcpy,如何将连续的常量全局内存块复制到(连续的)私有内存块?我需要像memcpy这样的东西,但是用于在不同的OpenCL地址空间之间复制字节。我知道块的大小和数据是连续存储在全局和本地/私有mem中的,所以,一般来说,这应该是可能的,对吗 在我的具体问题中,我有一个结构类型的常量全局数组,它包含int、float甚至另一个结构类型。为了防止将结构的每个成员从全局mem中分离出来(这很慢),我希望在私有内存中有一个完整数组元素的副本。遗憾的是,执行privatestuct=globalstruct[i]

如何将连续的常量全局内存块复制到(连续的)私有内存块?我需要像memcpy这样的东西,但是用于在不同的OpenCL地址空间之间复制字节。我知道块的大小和数据是连续存储在全局和本地/私有mem中的,所以,一般来说,这应该是可能的,对吗

在我的具体问题中,我有一个结构类型的常量全局数组,它包含int、float甚至另一个结构类型。为了防止将结构的每个成员从全局mem中分离出来(这很慢),我希望在私有内存中有一个完整数组元素的副本。遗憾的是,执行privatestuct=globalstruct[i]之类的操作不会产生完整结构的深度副本

当然,我不是第一个问这个或类似问题的人,所以stackoverflow上有几个线程在讨论相关问题。然而,实际上所有的答案都建议使用async_work_group_copy,因为它只为干净的内置数据类型定义,而不是混合结构、结构的结构或任何(如按位)用户定义的内存解释。不管怎么说,这是为当地人准备的

谢谢你的建议

1)将结构大小设置为4字节的倍数。例如,如果长度为125字节,则可以添加一个长度为3字节的char3,以拥有128字节的struct块

2)将结构、最大或4字节中的多个元素重新排序为“head”,将较小/非多个元素重新排序为“tail”。这将使您的结构需要更少的内存访问操作

3)正如DarkZeros提到的,您可以尝试使用_work_group_copy(如果结构太大,则转换为long16或类似)获取结构,然后将值按元素顺序传递到私有内存。有很多缓存线,所以从本地复制到私有将足够快。(不要忘记在转换之前/之后同步它们)

4)将小变量打包成大变量,直到它填满缓存通道,这样当缓存使用率很高时,通道的带宽就不会被浪费

但是,如果要将“单个”结构复制到线程组的“所有核心”,则可以按元素进行复制,因为某些较新的GPU具有广播技术,在这种情况下广播技术可能最快。请指出未来任何加速(如果算法碰巧有)作为乘数


5)有时严重的分支会清除性能并隐藏那些用于基准测试的内存延迟(当然是一种糟糕的方式)。

我在设计中使用了结构。访问速度慢没有问题。关键在于如何访问结构,以及是否以合并方式访问。也许你使用的结构不是最有效的模式。我建议您使用async\u work\u group\u copy(),但将指针强制转换为普通类型。然后,如果你知道结构的大小,那么在以后使用它(在另一次铸造之后)应该不会有任何问题。谢谢!我试试这个。。。该结构的目的是让线程所需的所有输入数据连续地存储在内存中,这样我就没有多少可以优化的了!我会试试这个,希望很快能有一些表现回来numbers@elorenz这有帮助吗?