我想知道是否可以在另一个数组中创建/复制结构的特定成员的“虚拟”数组。假设我们有一个结构
struct foo {
int value;
char character;
};
现在假定存在一个包含此结构foo
的数组,并且我有一个操作需要将所有int value
的加在一起。通过使用指针添加所有值的循环,这通常非常容易。问题是我正在使用OpenCL,需要将阵列复制到某些设备。在OpenCL中,这是使用
clEnqueueWriteBuffer(cmdQueue, buffer, CL_TRUE, 0, datasize, A, 0, NULL, NULL);
它将复制数组buffer
到设备。复制整个结构数组没有意义,因为这将花费更多时间,因为它还会发送不需要的character
。它还将占用OpenCL设备上的更多空间。因此是否可以将value
的“数组”从结构直接复制为设备的数组?
我知道我可以使用所有值在主机(CPU)上创建一个新数组,然后将该数组复制到OpenCL设备,但是随后我将花一些时间复制到本地int
数组中,然后再进行复制。将该阵列复制到OpenCL设备。
是否可以直接从仅包含value
的{{1}}结构数组中复制foo
的“虚拟”数组?
请注意,这是我的实际问题的非常简化的示例,并希望避免将int value
从一开始就放在单独的数组中,然后结构将指向这些数组。我非常怀疑这样做是否可行,如果我的解释甚至有意义,也希望获得反馈!
答案 0 :(得分:2)
否。
clEnqueueWriteBuffer
需要一个连续的容器。您不能创建“虚拟”连续容器。
[I]希望避免将值从一开始就放在单独的数组中。
在这一点上,您必须分析和比较两个实现:一个按原样复制数组和多余的数据,另一个创建要发送的有用数据的本地副本。比较并选择。
答案 1 :(得分:1)
如果有一个结构体数组,则需要一个仅带有值的登台缓冲区,这是CPU端的额外副本。
有时这样的工作是不可避免的,但是如果可以的话,最好有多个连续值数组。即使在纯CPU工作中,这也通常会提高CPU缓存的效率,因为它避免了不必要成员的读/写,并且对于SSE这样的SIMD指令集通常更容易。
例如,您可以使int *values
和char *chars
具有相同的长度(尽管更喜欢std::vector
或std::unique_ptr<T[]>
之类的类型!),复制就很容易。 / p>