错误-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 检索构建日志并检查编译出错的位置。
我在这一行收到错误 -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 检索构建日志并检查编译出错的位置。