15

nvidia GPU で OpenCL を使用していますが、カーネルを実行しようとすると CL_INVALID_KERNEL_ARGS が発生し続けます。私はそれを非常に単純なプログラムに落としました:

__kernel void foo(int a, __write_only image2d_t bar)
{
  int 2 coords = {0, get_global_id(0)};
  write_imagef(バー、座標、(float4)a);
}

次の C プログラムを使用します (簡潔にするために、初期化ビットとエラー チェック ビットをスキップします)。

cl_kernel foo = clCreateKernel(program, "foo", &err);
int a = 42;
clSetKernelArg(foo, 0, sizeof(int), &a);

cl_image_format fmt = {CL_INTENSITY, CL_FLOAT};
cl_mem バー = clCreateImage2D(ctx, CL_MEM_WRITE_ONLY|CL_MEM_ALLOC_HOST_PTR, &fmt, 100, 1, 0, NULL, &err));
clSetKernelArg(foo, 1, sizeof(cl_mem), &bar);

size_t gws[] = {100};
size_t lws[] = {100};
cl_event イベント;
clEnqueueNDRangeKernel(queue, foo, 1, NULL, gws, lws, 0, NULL, &evt);
clFinish(キュー);

clEnqueueNDRangeKernel が CL_INVALID_KERNEL_ARGS を返し続けます。何か案は?

4

2 に答える 2

5

https://stackoverflow.com/a/20566270/431528を参照してください。

渡すバッファ オブジェクトの大きさは? __constant 引数は、グローバル メモリからではなく、別のメモリ空間から割り当てられるため、おそらく定数メモリが不足しています。

を使用して、そのサイズを超えていないことを確認CL_DEVICE_MAX_CONSTANT_BUFFER_SIZEしてください。clGetDeviceInfo

于 2017-06-22T10:39:33.150 に答える
4

ホスト上の変数をカーネルに渡そうとしています。変数を作成し、cl_memを使用して値をコピーしてから、または変数をカーネルclEnqueueWriteBufferに渡す必要があります。それ以外は、あなたのコードは私にはうまく見えます。cl_memcl_int

于 2013-09-12T05:37:30.077 に答える