2016-06-23 20 views
1

async_work_group_copyを使用して、openCLで__globalから__localにデータをコピーする必要があります。問題は、私は組み込みのデータ型を使用していないことです。async_work_group_copyをカスタムデータ型で使用する

次のように私が試したもののコードスニップです:

「」int型の単なるベクトルである
typedef struct Y 
{ 
    ... 
} Y; 

typedef struct X 
{ 
    Y y[MAXSIZE]; 
} X; 

kernel void krnl(global X* restrict x){ 
    global const Y* l = x[a].y; 

    local Y* l2; 

    size_t sol2 = sizeof(l); 

    async_work_group_copy(l2, l, sol2, 0); 
} 

を。このコードは動作しません。具体的には、gen_typeは組み込み型ではないからです。スペック(1.2)は言う:特に記載のない限り

我々は、引数の型として...組み込みデータ 種類を示すために、ジェネリック型名gentypeを使用しています。

このデータタイプはどのようにして記述しますか?

答えて

3

OpenCL async_work_group_copy()は、基本データ型のN要素をコピーするように設計されています。しかし、実際に何がコピーされているのかはわかりません。だから、あなたは内部に(構造体を含む)任意の型を含むNバイトをコピーするように言うことができます。 memcpy()と同様です。

あなたが行うことができます。

kernel void krnl(global X* restrict x){ 
    global const Y* l = x[a].y; 
    local Y l2; 

    size_t sol2 = sizeof(Y); 

    async_work_group_copy((local char *)&l2, (global char *)l, sol2, 0); 
} 

しかし、あなたが側で明示的にカーネルをローカルメモリを宣言するか、dinamically API側からローカルメモリへのポインタを渡す必要があることを覚えておいてください。 ローカルポインタを初期化せずに作成してそこにコピーするだけでは意味がありません。 (私のコードを参照してください)

関連する問題