OpenCL:如何传递大小大于max_parameter_size的参数?

时间:2013-03-20 16:11:25

标签: opencl gpgpu pyopencl

出于好奇心找到我在调用OpenCL内核时可以传递的最大参数大小,我发现我可以传递一个大小超过最大大小的数组。这是发生了什么: (通过,我使用pyopencl)

>>> 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的数组。 这怎么可能?我哪里出错?

1 个答案:

答案 0 :(得分:3)

CL_DEVICE_MAX_PARAMETER_SIZE是指传递给 clSetKernelArg 的内核参数的最大大小。请参阅clGetDeviceInfo中的CL_DEVICE_MAX_MEM_ALLOC_SIZE和CL_DEVICE_GLOBAL_MEM_SIZE。