【发布时间】: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