【问题标题】:PyOpenCL kernel parametersPyOpenCL 内核参数
【发布时间】:2018-10-26 15:28:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: python opencl pyopencl


    【解决方案1】:

    根据“OpenCL in Action”一书,参数是:

    1. 队列
    2. global_size: 元组
    3. local_size: 元组
    4. *args:内核参数
    5. global_offset=无
    6. wait_for=无

    内核函数由您在代码中称为 kernel_name 的名称选择。 例如。如果你有一个名为“__kernel void foo(...)”的内核函数,那么只需在 Python 中调用 program.foo(...)。 global_size 指定使用多少工作项,本地大小指定工作组的大小。 内核的参数按照它们在内核函数中出现的顺序传递,用*args表示。

    这是上述书中的一个例子: program.mult(queue, (25,), (25,), scalar, float_buffer, lm)。 从程序中,创建了名为“mult”的内核,全局和局部大小设置为 25,即它是一个一维任务,参数 scalar(类型为 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

    【讨论】:

    • 你能解释一下为什么它是全局和本地大小的元组吗?
    • 全球尺寸,你说你想要多少工作项。它可以是 1d、2d 或 3d 元组,例如您想更改 320x240px 图像的亮度 -> 只需使用 (320, 240) 作为全局大小。使用本地大小,您可以说要在工作组中放入多少工作项,即您对工作项进行分区。工作组中的项目可以一起工作,例如他们可以共享快速的本地内存。因为您将全局大小与本地大小划分为组,所以两者必须具有相同的维度,例如g.s=(1,10) 和 l.s.=(1,2) 给出 5 个组。如果你不关心工作组,就放None。
    猜你喜欢
    • 2016-06-25
    • 2021-07-21
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多