是否可以将结构数组别名为结构成员数组?

Can I alias an array of structs to an array of struct members?

本文关键字:数组 结构 成员 别名 是否      更新时间:2023-10-16

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

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-array,然后将该数组复制到 OpenCL 设备。

是否可以直接从仅包含int values的foo结构数组中复制value的"虚拟"数组?

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

No.

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

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

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

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

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

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