错误-11

error -11 OpenCL

我在这一行收到错误 -11

checkerror(clBuildProgram(program, deviceidcount, deviceids.data(), nullptr, nullptr, nullptr));

我的内核是

__kernel void render(double playerx,double playery,double playerz,double yaw,double pitch,double x1,double y1,double z1,double x2,double y2,double z2,double x3,double y3,double z3,__global int* texture){
    //const int i = get_global_id(0);
    //x[i] = a*x[i];
    //x[i] = cos(a);
    x1 = x1-playerx;
    y1 = y1-playery;
    z1 = z1-playerz;
    x2 = x2-playerx;
    y2 = y2-playery;
    z2 = z2-playerz;
    x3 = x3-playerx;
    y3 = y3-playery;
    z3 = z3-playerz;

    double smallyaw = yaw - M_PI_2;
    double bigpitch = pitch + M_PI_2;

    double screenx1 = cos(smallyaw)*cos(pitch)*x1 + sin(smallyaw)*cos(pitch)*y1 + sin(pitch)*z1;
    double screeny1 = cos(yaw)*cos(bigpitch)*x1 + sin(yaw)*cos(bigpitch)*y1 + sin(bigpitch)*z1;
    double screenz1 = cos(yaw)*cos(pitch)*x1 + sin(yaw)*cos(pitch)*y1 + sin(pitch)*z1;
    printf(screenx1);
    printf(screeny1);
    printf(screenz1);
}

我看不出它在语法方面有什么问题。我也尝试用浮点数替换所有双打。

这很愚蠢,在看了最长时间之后我注释掉了 printf 行并且它起作用了。我应该如何检查这些变量等于什么。谁能告诉我如何正确打印东西?

从多个内核打印输出可能会产生意想不到的结果。时间不对,打印不按任何特定顺序返回等。尝试仅从一个工作项目打印。

if i == 0{
    printf(...)
}

您还可以在其上方放置一个屏障,并在需要时循环遍历工作项 0 中的多个值。

printf("value = %#g\n", 3.012);

向控制台打印 3.012。

应该以线程安全的方式打印到控制台,因此您的 cl 线程应该与控制台刷新线程相同。

i can't see anything wrong with it in the terms of syntax.

好吧,请仔细看一下,因为这不是您使用 printf 的方式。

如果你想打印双打使用

printf("%f", value);

如果这没有意义,建议阅读通用 C printf 和 OpenCL printf 的文档。

此外,由于 -11 是 CL_BUILD_PROGRAM_FAILURE,您可以使用 clGetProgramBuildInfo 检索构建日志并检查编译出错的位置。