在主机上读写OpenCL结构可能是不平凡的。它们的内存中布局可能取决于OpenCL设备的体系结构,并且它们的排列顺序不一定是主机的。
您可以使用packed
属性控制布局。如果您使用packed
,则会精确指定结构成员的布局,而不是根据OpenCL设备的体系结构对齐成员的默认结构。但请注意,使用packed
时,您可能会失去性能。
或者,你也可以“问” OpenCL设备的结构布局与小仁:
kernel void struct_layout(global unsigned long* totalSize, global unsigned long* fieldOffsets)
{
tpoint theStruct;
totalSize[0] = sizeof(theStruct);
unsigned long baseOffset = (unsigned long)&theStruct;
fieldOffsets[0] = (unsigned long)&theStruct.x - baseOffset;
fieldOffsets[1] = (unsigned long)&theStruct.y - baseOffset;
}
为您的特定情况下,如果你装的tpoint结构,然后从Java中,你可以只使用一个字节缓冲区和读/写int值,并在每个结构值的x
和y
成员之间交替。
ByteBuffer buf = ...;
int x1, y1 = ...;
int x2, y2 = ...;
buf.putInt(x1).putInt(y1);
buf.putInt(x2).putInt(y2);