Opencl 属性(需求工作组大小(X,Y,Z))用于什么?

Opencl 属性(需求工作组大小(X,Y,Z))用于什么?,opencl,Opencl,我是一名新的OpenCL程序员,对如何设置工作组大小感到困惑。设置工作组大小的正确方法是: 在主机代码的clenqueendrangekernel中设置本地工作大小参数 在内核代码中使用\uuuuu属性(需求工作组大小(X,Y,Z)) 两者都使用 别的 这样可以确保传入正确的工作组大小。通常,本地内存的必要大小是工作组大小的函数。例如,在图像的16x16平铺上工作 例如,一个人可以写: __attribute__((reqd_work_group_size(16, 16, 1))) kernel

我是一名新的OpenCL程序员,对如何设置工作组大小感到困惑。设置工作组大小的正确方法是:

  • 在主机代码的
    clenqueendrangekernel
    中设置本地工作大小参数
  • 在内核代码中使用
    \uuuuu属性(需求工作组大小(X,Y,Z))
  • 两者都使用
  • 别的

  • 这样可以确保传入正确的工作组大小。通常,本地内存的必要大小是工作组大小的函数。例如,在图像的16x16平铺上工作

    例如,一个人可以写:

    __attribute__((reqd_work_group_size(16, 16, 1)))
    kernel foo void(...) {
       local float tile[16][16]; // compiler allocates local memory
       ...
    }
    

    编译器分配本地内存,我们不需要将其作为显式参数传入。然而,我们需要确保工作组的大小符合这一假设。这个属性正好如此。

    所以设置工作组大小是硬代码,对吗?是否可以动态设置工作组大小?您可以在内核编译时将其作为#define传递(或者动态地,或者事先,编译各种预定义大小并在运行时交换),但据我所知,您不能拥有真正的动态大小的本地数组。您可以将本地缓冲区作为内核参数传入,并在将NDRange排入队列时使用
    clSetKernelArg
    来改变大小。这使得它在NDrange之间是动态的。