3

ベクターの構造体を OpenCL カーネルに渡す際に問題が発生しています。

簡単に言うと、C 構造体を渡すことができることがわかりました。

typedef struct {
    cl_float4 vec;
} my_type;

. . . カーネルに、次のように宣言すると:

typedef struct { float s[4]; } my_float4;
typedef struct { my_float4 vec; } my_type; //use custom float4
__kernel void function(const my_type test) {}

. . . しかし、次のように宣言した場合はそうではありません:

typedef struct { float4 vec; } my_type; //use built-in float4
__kernel void function(const my_type test) {}

私の質問は、float4 の違いと特別な点は何ですか? 2 番目の例では、clSetKernelArg で CL_INVALID_ARG_SIZE を取得します。ホスト コードでは cl_float4 を使用していますが、これはカーネルで float4 とペアになっているはずではありませんか?


編集: リクエストにより、clSetKernelArg コード (エラー処理がトリミングされています):

template <typename type_data> void set_argument(int arg_index, const type_data* data) {
    cl_int err = clSetKernelArg(kernel,arg_index,sizeof(type_data),data);
    if (err!=CL_SUCCESS) throw "ERROR"; /*simplified*/
}

上記とまったく同じように宣言された構造体で関数を呼び出します。

my_type test;
my_kernel->set_argument(0,&test);
4

1 に答える 1

3

これは実装のバグのように思えます。そのユーザー定義型を問題なくカーネルに渡すことができるはずです。どのプラットフォーム/SDK を使用していますか? ホスト コードでこの型を正常に宣言できました。

typedef struct _mytype {
    cl_float4 val;
} mytype;

...そして後でそれを使用します:

mytype t;
status = clSetKernelArg(kernel, argc++, sizeof(mytype), &t);
check_status("clSetKernelArg:mytype t", status);

check_status は期待どおりの動作をします: 非CL_SUCCESS戻り値をチェックします。

カーネルは次のようになります。

typedef struct _mytype {
  float4 value;
} mytype;

kernel void do_it(/* ... */, const mytype test) { /* ... */ }

これはコンパイルおよび実行され、CPU デバイスで正しい結果が得られます。

于 2012-06-23T21:10:26.480 に答える