PyOpenCL 内核参数
PyOpenCL kernel parameters
根据 documentation,kernal_name
函数需要 3 个 API 参数:
program.kernel_name(queue, shape, None, kernal-params...)
但没有记录,None
和 shape
参数的用途。据我了解,第三个参数是内核函数本身,可能只是 None
,但是第二个参数 shape
用于什么?
根据书本"OpenCL in Action"参数为:
- 队列
- global_size: 元组
- local_size: 元组
- *args:内核参数
- global_offset=None
- wait_for=None
内核函数是根据您在代码中调用的名称 kernel_name 选择的。
例如。如果你有一个名为“__kernel void foo(...)”的内核函数,那么只需在 Python 中调用 program.foo(...)。
global_size 指定使用了多少个工作项,本地大小指定了工作组的大小。
内核的参数按照它们在内核函数中出现的顺序传递,记为*args.
这是上述书中的一个例子:
program.mult(queue, (25,), (25,), scalar, float_buffer, lm)
。
从程序中,创建了名称为 "mult" 的内核,全局和局部大小设置为 25,即它是一维任务,参数标量(numpy.float32 类型),float_buffer ( cl.Buffer 类型)和 lm(cl.LocalMemory 类型)传递给内核。
对应的内核是:
__kernel void mult(float num, __global float *global_floats, __local float4 *local_floats) {...}
当然你也可以按照纯C的方式来做。这需要更多的输入,但好处是很清楚会发生什么:
- 创建内核:cl.Kernel
- 设置参数:kernel.set_arg
- 排队任务:cl.enqueue_nd_range_kernel
根据 documentation,kernal_name
函数需要 3 个 API 参数:
program.kernel_name(queue, shape, None, kernal-params...)
但没有记录,None
和 shape
参数的用途。据我了解,第三个参数是内核函数本身,可能只是 None
,但是第二个参数 shape
用于什么?
根据书本"OpenCL in Action"参数为:
- 队列
- global_size: 元组
- local_size: 元组
- *args:内核参数
- global_offset=None
- wait_for=None
内核函数是根据您在代码中调用的名称 kernel_name 选择的。 例如。如果你有一个名为“__kernel void foo(...)”的内核函数,那么只需在 Python 中调用 program.foo(...)。 global_size 指定使用了多少个工作项,本地大小指定了工作组的大小。 内核的参数按照它们在内核函数中出现的顺序传递,记为*args.
这是上述书中的一个例子:
program.mult(queue, (25,), (25,), scalar, float_buffer, lm)
。
从程序中,创建了名称为 "mult" 的内核,全局和局部大小设置为 25,即它是一维任务,参数标量(numpy.float32 类型),float_buffer ( cl.Buffer 类型)和 lm(cl.LocalMemory 类型)传递给内核。
对应的内核是:
__kernel void mult(float num, __global float *global_floats, __local float4 *local_floats) {...}
当然你也可以按照纯C的方式来做。这需要更多的输入,但好处是很清楚会发生什么:
- 创建内核:cl.Kernel
- 设置参数:kernel.set_arg
- 排队任务:cl.enqueue_nd_range_kernel