【问题标题】:OpenCL kernel argumentsOpenCL 内核参数
【发布时间】:2012-02-05 09:02:45
【问题描述】:
我刚刚开始摆弄 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 方法。
【问题讨论】:
标签:
java
struct
opencl
lwjgl
【解决方案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);