在OpenCL代码中使用clamp函数

时间:2012-08-16 10:23:14

标签: c++ opencl

在我的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的环境。

3 个答案:

答案 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中的那些(将标量参数转换为向量)。