2013-03-20 4 views
0

Из любопытства, чтобы найти максимальный размер параметра, который я могу передать при вызове ядра 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. Как это возможно? или Где я иду не так?

ответ

3

CL_DEVICE_MAX_PARAMETER_SIZE относится к максимальному размеру параметра ядра, переданного clSetKernelArg. См. CL_DEVICE_MAX_MEM_ALLOC_SIZE и CL_DEVICE_GLOBAL_MEM_SIZE в clGetDeviceInfo.

+0

'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

+3

Вам следует отказаться от угадывания и предположения, а скорее принять то, что говорится в стандарте. Как указано в ответе, 'CL_DEVICE_MAX_MEM_ALLOC_SIZE' сообщает вам, сколько вы можете выделить сразу. – matthias

+0

@matthias, Вы абсолютно правы, я не должен был догадываться. Но мне не удалось найти единицы (т. Е. Биты/байты/килобайт/МБ) значений, возвращаемых с помощью этих запросов на устройство OpenCL, и я потратил часы на Google для этого. Теперь я знаю, кто они. Спасибо за помощь. – Yash

 Смежные вопросы

  • Нет связанных вопросов^_^