我刚刚开始摆弄OpenCL,我遇到了一个问题:我不知道如何将复杂的数据结构作为参数传递。我正在使用LWJGL的OpenCL绑定,以及wiki http://lwjgl.org/wiki/index.php?title=Sum_Example中提供的示例。在该示例中,创建2个浮点缓冲区并作为参数传递(LWGJL在名为BufferUtils的类中提供用于创建这些缓冲区的方法)。
现在,我将如何创建点,typedef struct {int x, int y} tpoint
或结构的缓冲区? Java中没有结构体。此外,没有BufferUtils.createStructBuffer方法。
答案 0 :(得分: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;
}
对于您的特定情况,如果您从Java打包tpoint结构,您可以使用字节缓冲区并读取/写入它并在每个结构的x
和y
成员之间交替值。
ByteBuffer buf = ...;
int x1, y1 = ...;
int x2, y2 = ...;
buf.putInt(x1).putInt(y1);
buf.putInt(x2).putInt(y2);