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

时间:2014-01-14 09:12:14

标签: memory struct opencl memcpy

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

在我的具体问题中,我有一个包含int,float的结构类型的常量全局数组,甚至还有另一种结构类型。为了防止将结构的每个成员与全局mem分开(这很慢),我希望在私有内存中有一个完整数组元素的副本。像privatestruct = globalstruct [i]这样的事情不幸的是不会导致完整结构的深层副本。

当然我不是第一个问这个或类似问题的人,所以stackoverflow上有几个线程讨论相关问题。但是,实际上所有的答案都建议使用async_work_group_copy,因为它只是为了清晰的内置数据类型而不是混合结构,结构结构或任何(例如按位)用户定义的内存解释而定义,因此不能作为通用答案。 。无论如何它都适用于本地内存。

非常感谢任何建议!!

1 个答案:

答案 0 :(得分:3)

1)使结构大小为4个字节的倍数。例如,如果长度为125个字节,则可以添加一个长度为3个字节的char3,以获得128个字节的struct。

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

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

4)将小变量打包成较大的变量,直到它填满缓存通道,以便在高速缓存使用时不会浪费通道的带宽。

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

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