【问题标题】:CL_KERNEL_WORK_GROUP_SIZE keeps changingCL_KERNEL_WORK_GROUP_SIZE 不断变化
【发布时间】:2016-05-29 17:25:01
【问题描述】:

我正在尝试对 100x2025 矩阵(100 个向量)中的所有向量进行归一化。我将每个向量作为本地内存中的一个工作组进行处理。我的最大工作组大小是 512,所以我最初将全局大小设置为 {100, 2048},将局部大小设置为 {1,512}(我为每个工作项处理 4 个元素,并在内核中用零填充向量以使其具有2.)

经过一番麻烦后,我意识到虽然我的设备的最大工作组大小是 512,但我的 KERNEL_WORK_GROUP_SIZE 是 256。

所以现在我用 256 个工作组处理每个工作项的 8 个元素...

我刚刚对内核做了一个非常微妙的更改(将“get_local_size(0)”调用更改为“get_local_size(1)”),现在我的 KERNEL_WORK_GROUP_SIZE 为 224,我得到无效的工作组大小?

这非常令人沮丧,我不明白是什么决定了这种变化。我的全局工作量甚至不能被 224 整除。

【问题讨论】:

  • 如果你改变你的代码,编译后的代码也会改变,并可能导致最大尺寸的改变。这将在低端设备上有效地发生。因此,仅将内核修复到给定大小被认为是一种不好的做法。您应该依赖 get_local_size() 值。

标签: kernel size opencl


【解决方案1】:

正如您已经从名称中猜到的那样,KERNEL_WORK_GROUP_SIZE 是特定内核的最大工作组大小。这个数字取决于内核源代码、您使用的 OpenCL 实现的细节、设备硬件,并受内核中使用的寄存器数量和本地内存的影响。它通常会低于CL_DEVICE_MAX_WORK_GROUP_SIZE,这是计算设备的理论最大工作组大小。

我通常将clEnqueueNDRangeKernel 中的本地工作组大小设置为NULL,以让实现决定一个好的值。您应该始终在内核代码中使用 get_local_size() 内省工作组大小,而不是依赖任何特定的工作组大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多