Opencl clEnqueueNDRangeKernel';失败,出现错误';资源不足';

Opencl clEnqueueNDRangeKernel';失败,出现错误';资源不足';,opencl,Opencl,在我的内核中,我调用一个函数sayf,它有一个无限循环,在++深度>5时中断。这在没有以下代码段的情况下有效 for(int j = 0;j < 9;j++){ f1 = inside(prev.o, s[j]); f2 = inside(x.o, s[j]); if((f1 ^ f2)){ stage = 0;

在我的内核中,我调用一个函数sayf,它有一个无限循环,在++深度>5时中断。这在没有以下代码段的情况下有效

for(int j = 0;j < 9;j++){
                    f1 = inside(prev.o, s[j]);
                    f2 = inside(x.o, s[j]);
                    if((f1 ^ f2)){
                        stage = 0;
                        break;
                    }
                    else if(fabs(offset(x.o, s[j])) < EPSILON)
                    {
                        id = j;
                        stage = 1;
                        break;
                    }
            }
for(int j=0;j<9;j++){
f1=内部(上一个o,s[j]);
f2=内部(x.o,s[j]);
如果((f1^f2)){
阶段=0;
打破
}
else if(fabs(偏移量(x.o,s[j]))

在s中循环9个元素是我在这里做的唯一事情。这是在无限循环中。我检查过,运行2次都没有问题,但第三次内存不足发生了什么?我并没有在任何地方创建任何新变量。while循环中有很多代码,它们的计算比上面的代码段更复杂,并且不会遇到问题。我的猜测是,我在存储s时出错了。

如果您阅读OpenCL文档,则不会产生错误,因为内核代码是错误的。代码甚至根本没有运行,这一切都发生在排队步骤:

CL_OUT_OF_资源: 如果由于执行内核所需的资源不足,导致无法在命令队列中将内核的执行实例排队。例如,由于寄存器或本地内存等资源不足,显式指定的本地工作大小会导致内核执行失败。 另一个例子是内核中使用的只读映像参数的数量超过了设备的CL_DEVICE_MAX_read_image_args值,或者内核中使用的只读映像参数的数量超过了设备的CL_DEVICE_MAX_write_image_args值,或者内核中使用的采样器的数量超过了设备的CL_DEVICE_MAX_采样器


检查本地内存大小、本地组大小、常量内存和内核参数大小。

如果阅读OpenCL文档,则不会产生错误,因为内核代码错误。代码甚至根本没有运行,这一切都发生在排队步骤:

CL_OUT_OF_资源: 如果由于执行内核所需的资源不足,导致无法在命令队列中将内核的执行实例排队。例如,由于寄存器或本地内存等资源不足,显式指定的本地工作大小会导致内核执行失败。 另一个例子是内核中使用的只读映像参数的数量超过了设备的CL_DEVICE_MAX_read_image_args值,或者内核中使用的只读映像参数的数量超过了设备的CL_DEVICE_MAX_write_image_args值,或者内核中使用的采样器的数量超过了设备的CL_DEVICE_MAX_采样器


检查本地内存大小、本地组大小、常量内存和内核参数大小。

可以发布更多代码吗?这可能不是特定代码的问题。然而,编译器非常聪明,当你删除一些东西时,它能够简化内核的所有其余部分。你能发布更多的代码吗?这可能不是特定代码的问题。然而,编译器是非常聪明的,当你删除一些东西时,它能够简化内核的所有其余部分。感谢Matereducation当地的工作规模适合我。谢谢,伙计