在OpenCL 1.1中,我对函数min()的调用是模糊的,我无法弄清楚为什么

时间:2010-10-07 15:33:41

标签: opencl

我刚从OpenCL 1.0升级到1.1。当我调用min()函数时,我得到错误输出:

    <program source>:45:44: error: call to 'min' is ambiguous
            int nFramesThisKernelIngests = min(nFramesToIngest  - nAvg*nPP*get_global_id(2), nAvg*nPP);

<built-in>:3569:27: note: candidate function
double16 __OVERLOADABLE__ min(double16, double16);                                               
                           ^
<built-in>:3568:26: note: candidate function
double8 __OVERLOADABLE__ min(double8, double8);   

对于具有不同类型的更多行,错误输出会继续。

当我试图找出问题时,get_global_id(2)似乎就成了问题。我认为将get_global_id(2)从uint(我相信它返回一个uint)转换为int将解决问题,但事实并非如此。有人知道发生了什么吗?我查看了1.0和1.1规范,我仍然对为什么会发生这种情况感到困惑。

2 个答案:

答案 0 :(得分:6)

OpenCL 1.0和1.1规范定义min具有以下功能签名:

gentype min (gentype x, gentype y) 
gentype min (gentype x, sgentype y)

因此,参数类型必须相同,或者1个向量和与向量元素类型匹配的标量,例如。

int4 a,b;
int c; 
min(a,b); // All arguments have the same type
min(a,c); // 2nd element may be scalar, matching the 
          // element type of the 1st argument ( a vector type )

另请注意,get_global_id的返回类型为size_t,大小可能为32或64位。

您必须转换表达式结果以选择最小的特定重载。

min有很多重载(因为编译器错误信息有点无用),例如。

min(float  a, float  b);
min(float2 a, float2 b);
min(float2 a, float  b);
min(float3 a, float3 b);
min(float3 a, float  b);
min(float4 a, float4 b);
... // and vector sizes 4,8,16
min(double a, double b); // With an OpenCL 64bit floating point extension enabled
min(double2 a, double b); // With an OpenCL 64bit floating point extension enabled
... // and integral scalar and vector types (char, schar, short, ushort, int, etc)

...

答案 1 :(得分:1)

我真的不知道OpenCL,但看起来编译器不知道它是否应该提升mindouble8的{​​{1}}参数。由于这些类型是向量而不是标量,我猜double16不是您正在寻找的函数。请改为fmin

编辑:您是否在错误消息中看到以下内容?

min

JAB IN THE DARK:将所有内容投放到<built-in>:xxxx:yy: note: candidate function int __OVERLOADABLE__ min(int, int);

int

如果编译,则按照愚蠢的降序删除演员表(例如,第一个演员表可能没有意义,但是YMMV)。