PyOpenCL 内核参数

PyOpenCL kernel parameters

根据 documentationkernal_name 函数需要 3 个 API 参数:

program.kernel_name(queue, shape, None, kernal-params...)

但没有记录,Noneshape 参数的用途。据我了解,第三个参数是内核函数本身,可能只是 None,但是第二个参数 shape 用于什么?

根据书本"OpenCL in Action"参数为:

  1. 队列
  2. global_size: 元组
  3. local_size: 元组
  4. *args:内核参数
  5. global_offset=None
  6. 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的方式来做。这需要更多的输入,但好处是很清楚会发生什么:

  1. 创建内核:cl.Kernel
  2. 设置参数:kernel.set_arg
  3. 排队任务:cl.enqueue_nd_range_kernel