2012-01-08 17 views
2

私はOpenCLを使い始めました。私は問題に遭遇しました。複雑なデータ構造を引数として渡す方法はわかりません。私はLWJGLのOpenCLバインディングを使用しています。例はwiki http://lwjgl.org/wiki/index.php?title=Sum_Exampleで提供されています。この例では、2つのfloatバッファが作成され、引数として渡されます(LWGJLは、これらのバッファを作成するために、BufferUtilsというクラスのメソッドを提供します)。OpenCLカーネルの引数

ここで、ポイントのバッファー、一般にtypedef struct {int x, int y} tpoint、または構造体を作成するにはどうすればよいですか? Javaには構造体はありません。さらに、BufferUtils.createStructBufferメソッドはありません。

答えて

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構造体をパックした場合、あなただけ使用することができますそれにread/write intsを入れ、それぞれの構造体値のメンバーをxyの間で交互に入れ替えます。

ByteBuffer buf = ...; 

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

buf.putInt(x1).putInt(y1); 
buf.putInt(x2).putInt(y2); 
関連する問題