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構造体をパックした場合、あなただけ使用することができますそれにread/write intsを入れ、それぞれの構造体値のメンバーをx
とy
の間で交互に入れ替えます。
ByteBuffer buf = ...;
int x1, y1 = ...;
int x2, y2 = ...;
buf.putInt(x1).putInt(y1);
buf.putInt(x2).putInt(y2);