Python PyOpenCL内核参数

Python PyOpenCL内核参数,python,opencl,pyopencl,Python,Opencl,Pyopencl,根据kernal_name函数需要3个API参数: program.kernel_name(queue, shape, None, kernal-params...) 但是它没有文档化,使用的是None和shape参数。据我所知,第三个参数是内核函数本身,可以是None,但第二个参数shape用于什么?根据《OpenCL在运行》一书,参数是: 排队 全局大小:元组 局部大小:元组 *args:内核的参数 全局偏移=无 等待=无 内核函数是通过您在代码中称为kernel_name的名称来选择的。

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

program.kernel_name(queue, shape, None, kernal-params...)
但是它没有文档化,使用的是
None
shape
参数。据我所知,第三个参数是内核函数本身,可以是
None
,但第二个参数
shape
用于什么?

根据《OpenCL在运行》一书,参数是:

  • 排队
  • 全局大小:元组
  • 局部大小:元组
  • *args:内核的参数
  • 全局偏移=无
  • 等待=无
  • 内核函数是通过您在代码中称为kernel_name的名称来选择的。 例如,如果您有一个名为“u kernel void foo(…)”的内核函数,那么只需在Python中调用program.foo(…)。 全局大小指定使用多少个工作项,局部大小指定工作组的大小。 内核的参数是按照它们在内核函数中出现的顺序传递的,该顺序由*args表示

    以下是上述书中的一个示例:
    program.mult(队列,(25,),(25,),标量,浮点缓冲区,lm)
    。 从程序中,创建名为“mult”的内核,将全局和局部大小设置为25,即它是一个1D任务,并将参数scalar(numpy.float32类型)、float_buffer(cl.buffer类型)和lm(cl.LocalMemory类型)传递给内核。 相应的内核是:
    \uuuuu内核void mult(float num,\uuuu全局浮点*全局浮点,\uuuu局部浮点4*局部浮点){…}

    当然,您也可以按照纯C的方式进行操作。这需要更多的键入,但优点是可以非常清楚地看到发生了什么:

  • 创建内核:cl.kernel
  • 设置参数:kernel.set_arg
  • 排队任务:cl.enqueue\u和\u range\u内核

  • 你能解释一下为什么全局大小和局部大小都是元组吗?对于全局大小,你可以说你想要多少个工作项。它可以是1d、2d或3d元组,例如,您希望更改320x240px图像的亮度->仅使用(320240)作为全局大小。对于本地大小,您可以说您希望在一个工作组中放置多少个工作项,即划分您的工作项。工作组中的项目可以一起工作,例如,它们可以共享快速本地内存。因为您将全局大小和本地大小划分为多个组,所以这两个组必须具有相同的维度,例如g.s=(1,10)和l.s=(1,2)给出5个组。如果你不关心工作小组,那就什么也不关心。