【问题标题】:Can I alias an array of structs to an array of struct members?我可以将结构数组别名为结构成员数组吗?
【发布时间】:2018-10-01 09:53:14
【问题描述】:

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

struct foo {
  int value;
  char character;
};

现在假设有一个包含此结构foo 的数组,并且我有一个需要将所有int value 相加的操作。这通常很容易通过循环添加所有带有指针的值。问题是我正在使用 OpenCL,需要将数组复制到某个设备。在 OpenCL 中,这是使用

clEnqueueWriteBuffer(cmdQueue, buffer, CL_TRUE, 0, datasize, A, 0, NULL, NULL);

这会将数组buffer 复制到设备。复制整个结构数组没有意义,因为这会花费更多时间,因为它还会发送不需要的characters。它还会占用 OpenCL 设备上的更多空间。因此是否可以将 values 的“数组”从结构中直接作为数组复制到设备中?

我知道我可以在主机 (CPU) 上创建一个包含所有值的新数组,然后将该数组复制到 OpenCL 设备,但是我会花时间复制到本地 int-array,然后再复制它阵列到 OpenCL 设备。

是否可以直接从foo-structs 数组中复制values 的“虚拟”数组,只包含int values?

请注意,这是我实际问题的一个非常简化的示例,并且希望避免将 values 从一开始就放在单独的数组中,然后结构将指向该数组。我很怀疑这是可能的,如果我的解释有道理,但期待反馈!

【问题讨论】:

  • 你仍然可以循环调用clEnqueueWriteBuffer... :-/
  • 如果您有结构数组,您可以遍历指针并仅复制缓冲区中的“值”。此外,当您遍历指针时,请注意结构填充。您可以使用#pragma pack 1 来避免用于填充的额外字节。

标签: c++ arrays optimization struct copy


【解决方案1】:

没有。

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

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

此时,您必须分析和比较两种实现方式:一种是使用多余数据原样复制数组,另一种是创建要发送的有用数据的本地副本。比较和选择。

【讨论】:

  • 同上,谢谢!我自己没有编写程序,但现在正在为它实现 OpenCL,所以这样做会很好。现在将其更改为单独的数组。
【解决方案2】:

如果您有一个结构数组,则需要一个仅包含值的暂存缓冲区,这是 CPU 端的额外副本。

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

例如,您可以拥有相同长度的int *valueschar *chars(不过更喜欢std::vectorstd::unique_ptr<T[]> 之类的类型!),那么复制很容易。

【讨论】:

  • 谢谢。我自己没有编写程序,但现在正在为它实现 OpenCL,所以这样做会很好。现在将其更改为单独的数组。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多