Из любопытства, чтобы найти максимальный размер параметра, который я могу передать при вызове ядра OpenCL, я обнаружил, что могу передать массив размером больше максимального размера. Вот что происходит: (кстати, я использую pyopencl)OpenCL: Как передать параметр с размером больше max_parameter_size?
>>> plat = cl.get_platforms()
>>> dev = plat[0].get_devices(cl.device_type.ALL)
>>> dev[0]
<pyopencl.Device 'Juniper' on 'AMD Accelerated Parallel Processing' at 0x58fde60>
>>> dev[0].max_parameter_size
1024
На поиск Google, я узнал, что 1024 в байтах. (я забыл, где это было сказано, я думаю, что в форуме Nvidia.)
Теперь я побежал этот сценарий:
import pyopencl as cl
import numpy as np
plat = cl.get_platforms()
dev = plat[0].get_devices(cl.device_type.ALL)
ctx = ctx = cl.Context([ dev[0] ])
cq = cl.CommandQueue(ctx)
kernel = """
__kernel void test(__global int* A, __global int* B){
const int id = get_global_id(0);
B[ id ] = A[ id ];
barrier(CLK_GLOBAL_MEM_FENCE);
}
"""
prg = cl.Program(ctx, kernel).build()
A = np.ones((2**18,), dtype = np.int32)
B = np.zeros_like(A)
A_buf = cl.Buffer(ctx, cl.mem_flags.READ_ONLY|cl.mem_flags.COPY_HOST_PTR, hostbuf = A)
B_buf = cl.Buffer(ctx, cl.mem_flags.WRITE_ONLY, B.nbytes)
перед вызовом ядра, я сделал следующее:
>>> A.nonzero()[0].shape
(262144,)
>>> B.nonzero()[0].shape
(0,)
Тогда я назвал ядро и проверены на ненулевых элементов в B:
>>> prg.test(cq, A.shape, A_buf, B_buf).wait()
>>> cl.enqueue_copy(cq, B, B_buf)
>>> B.nonzero()[0].shape
(262144,)
Так, кл Раньше я могу отправить и прочитать массив размером более cl.max_parameter_size
. Как это возможно? или Где я иду не так?
'dev [0] .max_parameter_size' дает 1024, где dev [0] - это графический процессор, а' dev [2] .max_parameter_size' дает 4096, где dev [2] - это процессор на моем компе, и у них 1 ГБ и 4 ГБ ОЗУ соответственно. Поэтому я думаю, что 'dev [i] .max_parameter_size' возвращает размер памяти, доступный для вычислительного устройства ..... Следовательно, мое предположение, что они находятся в байтах, неверно, где они фактически находятся в MB. Спасибо за помощь. – Yash
Вам следует отказаться от угадывания и предположения, а скорее принять то, что говорится в стандарте. Как указано в ответе, 'CL_DEVICE_MAX_MEM_ALLOC_SIZE' сообщает вам, сколько вы можете выделить сразу. – matthias
@matthias, Вы абсолютно правы, я не должен был догадываться. Но мне не удалось найти единицы (т. Е. Биты/байты/килобайт/МБ) значений, возвращаемых с помощью этих запросов на устройство OpenCL, и я потратил часы на Google для этого. Теперь я знаю, кто они. Спасибо за помощь. – Yash