在OpenCL1.1中,我对函数min()的调用是不明确的,我不知道为什么

在OpenCL1.1中,我对函数min()的调用是不明确的,我不知道为什么,opencl,Opencl,我刚从OpenCL1.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: candid

我刚从OpenCL1.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_id2似乎就是问题所在。我认为从uint将get_global_id2转换为int可以解决问题,但事实并非如此。有人知道发生了什么事吗?我查看了1.0和1.1规范,仍然不清楚为什么会发生这种情况。

我不太了解OpenCL,但编译器似乎不知道应该将min的参数提升为double8还是double16。由于这些类型是向量而不是标量,我想min不是您要寻找的函数。试试看

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

<built-in>:xxxx:yy: note: candidate function
int __OVERLOADABLE__ min(int, int);

如果编译成功,请按愚蠢的降序删除强制类型转换,例如,第一个强制类型转换可能没有意义,但YMMV。

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)

...

只是一个关于double8和double16的注释。实际上,还有20行错误输出表示相同的内容,但类型不同,比如ushort、uint、float2、float4、float8、float16好的。。。NF框架、nAvg和nPP的类型是什么?获取全局id的结果类型是什么是的,我明白了:3435:22:注:候选函数int重载minint,int;我做了,转换为全球id2。这消除了我以前写的错误,但现在我得到了seg错误。这可能与32位或64位的大小有关吗?我真的迷路了…分段错误可能是由于错误地索引到内存或通过越界指针进行读/写。convert_int调用与C风格的强制转换相比可能有些过分。问题的源代码中没有足够的上下文来更精确地诊断。分段错误似乎来自我程序中不相关的部分。我相信这个问题已经解决了,只是OpenCL1.1对参数的计算更加严格。
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)

...