Учитывая float[n] inputdata
передать ядру OpenCL, может кто-нибудь просветить меня о различии между следующими тремя способами, чтобы передать это ядро:JOCL: зачем использовать буферы?
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));
B)
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) - это способ пойти, если вы все равно используете весь массив?
А как насчет B)? Это больше похоже на A), больше похоже на C) или еще что-то другое?
Таким образом, ограничение по размеру - это * только * разница? Например. до тех пор, пока B) работает, на самом деле нет причин использовать A) или C)? И будет ли он быстрее, чем A) и C), или медленнее (например, когда содержимое массива изменяется с помощью хоста) или они действительно эквивалентны? – user1111929
Семантика и размер. Если это буфер, вы должны использовать буфер, так как максимальный размер параметра может быть не меньше 256 байтов (!). Осторожнее с плакатом mfa, он ошибается, так как вы не можете легко передать данные в __local; вы можете установить размер __local-буфера во время вызова ядра (вам все равно нужно скопировать данные в __local.) Я бы использовал a, если вам нужно всего лишь получить данные на GPU. – Anteru