Продолжайте получать CL_INVALID_KERNEL_ARGS на nvidia gpu - программирование
Подтвердить что ты не робот

Продолжайте получать CL_INVALID_KERNEL_ARGS на nvidia gpu

Я использую OpenCL на графическом процессоре nvidia, и я продолжаю получать CL_INVALID_KERNEL_ARGS, когда пытаюсь выполнить ядро. Я перешел к очень простой программе:

__kernel void foo(int a, __write_only image2d_t bar)
{
  int 2 coords = {0, get_global_id(0)};
  write_imagef(bar, coords, (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 bar = 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 evt;
clEnqueueNDRangeKernel(queue, foo, 1, NULL, gws, lws, 0, NULL, &evt);
clFinish(queue);

ClEnqueueNDRangeKernel продолжает возвращать CL_INVALID_KERNEL_ARGS. Любые идеи?

4b9b3361

Ответ 1

Вы пытаетесь передать переменную на хосте на ядро. Вам нужно создать переменную cl_mem, а затем скопировать значение с помощью clEnqueueWriteBuffer, а затем передать переменную cl_mem или cl_int в ядро. Кроме этого ваш код выглядит хорошо для меня.

Ответ 2

См. fooobar.com/info/375336/....

Насколько велики объекты буфера, которые вы передаете? __constant аргументы выделяются из отдельного пространства памяти, а не из глобальной памяти, поэтому вы, вероятно, исчерпали постоянную память

Проверьте CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE с помощью clGetDeviceInfo, чтобы убедиться, что вы не превышаете этот размер.