gpt4 book ai didi

OpenCL 内核工作组大小限制

转载 作者:行者123 更新时间:2023-12-04 18:24:07 25 4
gpt4 key购买 nike

所以当我调用我的内核时,我总是遇到奇怪的错误;规定的最大内核工作组大小为 1,而我的设备(我的 Macbook)的工作组大小明显高于此。内核将代码限制在单个工作组中可能有哪些原因?这是我的内核之一:

__kernel
void termination_kernel(const int Elements,
__global float* c_I,
__global float* c_Ihat,
__global float* c_rI,
__local float* s_a)
{
const int bdim = 128;
int n = get_global_id(0);
const int tx = get_local_id(0); // thread index in thread-block (0-indexed)
const int bx = get_group_id(0); // block index (0-indexed)
const int gx = get_num_groups(0);

// is thread in range for the addition
float d = 0.f;
while(n < Elements){
d += pow(c_I[n] - c_Ihat[n], 2);
n += gx * bdim;
}

// assume bx power of 2
int alive = bdim / 2;
s_a[tx] = d;
barrier(CLK_LOCAL_MEM_FENCE);

while(alive > 1){
if(tx < alive)
s_a[tx] += s_a[tx + alive];
alive /= 2;
barrier(CLK_LOCAL_MEM_FENCE);
}

if(tx == 0)
c_rI[bx] = s_a[0] + s_a[1];
}

并且返回的错误是
OpenCL Error (via pfn_notify): [CL_INVALID_WORK_GROUP_SIZE] : OpenCL Error : clEnqueueNDRangeKernel     
failed: total work group size (128) is greater than the device can support (1)
OpenCL Error: 'clEnqueueNDRangeKernel(queue, kernel_N, dim, NULL, global_N, local_N, 0, NULL, NULL)'

我知道它说限制在设备上,但调试表明
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024


CL_KERNEL_WORK_GROUP_SIZE = 1

内核构造由
  char *KernelSource_T = readSource("Includes/termination_kernel.cl"); 
cl_program program_T = clCreateProgramWithSource(context, 1, (const char **) &KernelSource_T, NULL, &err);
clBuildProgram(program_T, 1, &device, flags, NULL, NULL);
cl_kernel kernel_T = clCreateKernel(program_T, "termination_kernel", &err);

我会包含调用函数,但我不确定它是否相关;我的直觉是内核代码中的某些东西在强制限制。有任何想法吗?在此先感谢您的帮助!

最佳答案

Apple OpenCL 不支持 CPU 上大于 [1, 1, 1] 的工作组。我不知道为什么,但至少在 OSX 10.9.2 之前就是这样。不过,较大的工作组在 GPU 上很好。

关于OpenCL 内核工作组大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com