Учитывая float[n] inputdata
для передачи в ядро OpenCL, кто-нибудь может объяснить мне разницу между следующими тремя способами передачи этого в ядро:
A)
cl_mem input = clCreateBuffer(context, CL_MEM_USE_HOST_PTR Sizeof.cl_float * n,
inputdata, NULL);
clSetKernelArg(kernel, i, Sizeof.cl_mem, Pointer.to(input));
В)
clSetKernelArg(kernel, i, Sizeof.cl_float * n, Pointer.to(inputdata));
С)
cl_mem input = clCreateBuffer(context, CL_MEM_options_here, Sizeof.cl_float * n,
NULL, NULL);
clEnqueueWriteBuffer(command_queue, input, CL_TRUE, 0, Sizeof.cl_float * n,
inputdata, 0, NULL, NULL);
clSetKernelArg(kernel, i, Sizeof.cl_mem, Pointer.to(input));
Правильно ли я понял, что разница между A) и C) заключается в том, что C) копирует весь массив один раз в начале, а затем работает с ним на GPU, в то время как A) должен загружать свои данные на лету ? Так что A) хорошо, если вам нужна только небольшая часть массива, и C) это путь, если вы все равно используете весь массив?
А как насчет Б)? Это больше похоже на А), больше похоже на С) или еще что-то другое?