2012-01-08 142 views
2

我刚刚开始讨论OpenCL,并遇到了一个问题:我不知道如何传递复杂的数据结构作为参数。我正在使用LWJGL的OpenCL绑定,以及wiki http://lwjgl.org/wiki/index.php?title=Sum_Example中提供的示例。在那个例子中,2个浮点缓冲区被创建并作为参数传递(LWGJL在一个名为BufferUtils的类中提供了用于创建这些缓冲区的方法)。OpenCL内核参数

现在,我将如何创建点的缓冲区,typedef struct {int x, int y} tpoint或一般的结构? Java中没有任何结构。此外,没有BufferUtils.createStructBuffer方法。

回答

1

在主机上读写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值,并在每个结构值的xy成员之间交替。

ByteBuffer buf = ...; 

int x1, y1 = ...; 
int x2, y2 = ...; 

buf.putInt(x1).putInt(y1); 
buf.putInt(x2).putInt(y2);