Java OpenCL内核参数

Java OpenCL内核参数,java,struct,opencl,lwjgl,Java,Struct,Opencl,Lwjgl,我刚刚开始摆弄OpenCL,遇到了一个问题:我不知道如何将复杂的数据结构作为参数传递。我正在使用LWJGL的OpenCL绑定,以及wiki中提供的示例。在该示例中,创建了2个浮点缓冲区并将其作为参数传递(LWGJL在一个名为创建这些缓冲区的类中提供了方法) 现在,我如何创建点的缓冲区,typedef struct{intx,inty}tpoint,或者一般的结构?Java中没有结构。此外,没有BufferUtils.createStructBuffer方法。在主机上读取和写入OpenCL结构非常

我刚刚开始摆弄OpenCL,遇到了一个问题:我不知道如何将复杂的数据结构作为参数传递。我正在使用LWJGL的OpenCL绑定,以及wiki中提供的示例。在该示例中,创建了2个浮点缓冲区并将其作为参数传递(LWGJL在一个名为创建这些缓冲区的类中提供了方法)


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

在主机上读取和写入OpenCL结构非常重要。它们的内存布局可能取决于OpenCL设备的架构,它们的端性不一定是主机的

您可以使用
packed
属性控制布局。如果使用
packed
,这将精确地指定结构成员的布局,而不是根据OpenCL设备的体系结构对齐成员的默认布局。但是,请注意,如果使用
打包
,可能会失去性能

或者,您也可以使用一个小内核“询问”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结构,那么您可以使用一个字节缓冲区,并对其读/写int,然后在每个结构值的
x
y
成员之间进行替换

ByteBuffer buf = ...;

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

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