OpenCL内核参数

时间:2012-01-08 13:49:09

标签: java struct opencl lwjgl

我刚刚开始摆弄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方法。

1 个答案:

答案 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结构,您可以使用字节缓冲区并读取/写入它并在每个结构的xy成员之间交替值。

ByteBuffer buf = ...;

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

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