在我的OpenCL代码中(我自己编码,它只是来自互联网的示例代码),有以下句子使用clamp的功能。
return clamp(color,0,1);
然而,这似乎在编译期间出错,所以我通过使用来自clGetProgramBuildInfo的CL_PROGRAM_BUILD_LOG获得了错误信息消息。
Error during compilation! (-11)
4483
build log
:211:9: error: call to 'clamp' is ambiguous
return clamp(color,0,1);
^~~~~
<built-in>:3558:26: note: candidate function
float4 __OVERLOADABLE__ clamp(float4 x, float min, float max) ;
^
<built-in>:3577:25: note: candidate function
float4 __OVERLOADABLE__ clamp(float4, float4, float4);
^
<built-in>:3556:26: note: candidate function
float3 __OVERLOADABLE__ clamp(float3 x, float min, float max) ;
^
<built-in>:3575:25: note: candidate function
float3 __OVERLOADABLE__ clamp(float3, float3, float3);
^
:296:52: error: address expression must be an lvalue or a function designator
r.origin = matrixVectorMultiply(viewTransform, &(float3)(0, 0, -1));
^~~~~~~~~~~~~~~~~~
:297:62: error: address expression must be an lvalue or a function designator
r.dir = normalize(matrixVectorMultiply(viewTransform, &(float3)(x, y, 0)) - r.origin);
^~~~~~~~~~~~~~~~~
在OpenCL代码中使用钳位功能是否有必要的关键字?顺便说一下,我正在使用Linux Ubuntu 10.04 64bit的环境。
答案 0 :(得分:5)
尝试以下
return clamp(color,0.0f,1.0f);
这样我们就可以确定第2和第3个参数不是模棱两可的,并且你试图调用函数:
clamp(float4 color, float min, float max);
如果这不起作用,那么请看你的颜色参数,但第二和第三个参数现在应该没问题了。
答案 1 :(得分:0)
我在同一段代码(http://www.gamedev.net/blog/1241/entry-2254210-realtime-raytracing-with-opencl-ii/)上遇到了同样的问题。它写得不好,并设法挂起我的电脑。
通过确保最后两个参数是浮点数,确实解决了clamp()问题。
通过更改该函数的签名来修复matrixVectorMultiply()问题。它最初是:
float3 matrixVectorMultiply(__global float* matrix, float3* vector){
float3 result;
result.x = matrix[0]*((*vector).x)+matrix[4]*((*vector).y)+matrix[8]*((*vector).z)+matrix[12];
result.y = matrix[1]*((*vector).x)+matrix[5]*((*vector).y)+matrix[9]*((*vector).z)+matrix[13];
result.z = matrix[2]*((*vector).x)+matrix[6]*((*vector).y)+matrix[10]*((*vector).z)+matrix[14];
return result;
}
但是,vector绝对没有理由成为指针,因此您可以在每次出现*
之前删除vector
。
然后代码应该编译,但程序可能仍然崩溃。
答案 2 :(得分:0)
可能不是你的问题,但值得注意的是:在OpenCL 1.0和1.1之间的钳位略有改变,所以如果你不小心,你可以拥有在一个版本而不是另一个版本中编译的代码。具体来说,在OpenCL 1.1规范,“附录F - 更改”,“F.1来自OpenCL 1.0的更改摘要”中,它说“以下功能已添加到OpenCL C编程语言中(第6部分):”,然后“新建内置函数“,然后”第6.11.3节中定义的钳位整数函数“
所以你最好完全确定你的参数。
与此相关,在OpenCL 1.1中添加了(向量,标量)变量的整数函数min和max,所以不要使用1.0中的那些(将标量参数转换为向量)。