2

In my OpenCL code (which is not coded by myself, it's just an example code from internet), there is the following sentence to use the function of clamp.

return clamp(color,0,1);

However it seems that this makes error during compilation, so I got the error info message by using CL_PROGRAM_BUILD_LOG from clGetProgramBuildInfo.

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);
                                                                                         ^~~~~~~~~~~~~~~~~

Is there any necessary keyword for using clamp function in OpenCL code? BTW, I'm using the environment of the Linux Ubuntu 10.04 64bit.

4

4 回答 4

5

尝试以下

return clamp(color,0.0f,1.0f);

这样我们就可以确定第二个和第三个参数没有歧义,并且您正在尝试调用该函数:

clamp(float4 color, float min, float max);

如果这不起作用,请查看您的颜色参数,但现在第二个和第三个参数应该没问题。

于 2012-08-16T10:56:02.633 回答
2

OpenCL中有几个重载的clamp内置函数;编译器需要根据参数的类型准确选择一个。有效的组合是

T clamp(T,T,T) and T clamp(T,S,S)

其中 T 是 OpenCL 整数或浮点类型之一,当 T 是向量类型时,S 是 T 的元素的标量类型。

您的示例代码似乎在调用中非法混合了浮点和整数参数。常量 1 和 0 是 type int,不像 0.0f 和 1.0f 是 type float

有关详细信息,请参阅快速参考卡

于 2012-08-17T11:56:47.923 回答
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.

然后代码应该编译,但程序可能仍然崩溃。

于 2013-12-14T11:49:04.883 回答
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 的 (vector, scalar) 变体,因此不要使用 1.0 中的变体(将标量参数转换为向量)。

于 2013-12-14T21:19:34.983 回答