我可以将结构数组别名为结构成员数组吗?

时间:2018-10-01 09:53:14

标签: c++ arrays optimization struct copy

我想知道是否可以在另一个数组中创建/复制结构的特定成员的“虚拟”数组。假设我们有一个结构

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从一开始就放在单独的数组中,然后结构将指向这些数组。我非常怀疑这样做是否可行,如果我的解释甚至有意义,也希望获得反馈!

2 个答案:

答案 0 :(得分:2)

否。

clEnqueueWriteBuffer需要一个连续的容器。您不能创建“虚拟”连续容器。

  

[I]希望避免将值从一开始就放在单独的数组中。

在这一点上,您必须分析和比较两个实现:一个按原样复制数组和多余的数据,另一个创建要发送的有用数据的本地副本。比较并选择。

答案 1 :(得分:1)

如果有一个结构体数组,则需要一个仅带有值的登台缓冲区,这是CPU端的额外副本。

有时这样的工作是不可避免的,但是如果可以的话,最好有多个连续值数组。即使在纯CPU工作中,这也通常会提高CPU缓存的效率,因为它避免了不必要成员的读/写,并且对于SSE这样的SIMD指令集通常更容易。

例如,您可以使int *valueschar *chars具有相同的长度(尽管更喜欢std::vectorstd::unique_ptr<T[]>之类的类型!),复制就很容易。 / p>