在我的OpenCL代码(不是我自己写的,它只是一个来自互联网的示例代码)中,有下面的一句话来使用夹具的功能。
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代码中使用clamp函数有没有必要的关键字?顺便说一句,我使用的环境是Linux Ubuntu 10.04 64位。
发布于 2012-08-16 18:56:03
请尝试以下操作
return clamp(color,0.0f,1.0f);这样,我们就可以确定第二个和第三个参数没有歧义,并且您正在尝试调用该函数:
clamp(float4 color, float min, float max);如果这不起作用,那么看看你的颜色参数,但是第二个和第三个参数现在应该没问题了。
发布于 2012-08-17 19:56:48
OpenCL中有几个重载的clamp内置函数;编译器需要根据参数的类型选择一个。有效的组合包括
T clamp(T,T,T) and T clamp(T,S,S)其中,T是OpenCL整型或浮点型之一,当T是向量类型时,S是T的元素的标量类型。
看起来您的示例代码非法地将浮点数和整数参数混合到调用中。与float类型的0.0f和1.0f不同,常量1和0属于int类型。
有关更多详细信息,请参阅quick reference card。
发布于 2013-12-14 19:49:05
我在同一段代码(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之前删除*。
然后代码应该会编译,但程序可能仍然会崩溃。
https://stackoverflow.com/questions/11985173
复制相似问题