gpt4 book ai didi

opencl - 在 OpenCL 1.1 中,我对函数 min() 的调用不明确,我不明白为什么

转载 作者:行者123 更新时间:2023-12-01 10:12:56 25 4
gpt4 key购买 nike

我刚刚从 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 转换为 int(我相信它返回一个 uint)可以解决问题,但事实并非如此。有人知道发生了什么事吗?我查看了 1.0 和 1.1 规范,但我仍然对发生这种情况的原因感到困惑。

最佳答案

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)

...

关于opencl - 在 OpenCL 1.1 中,我对函数 min() 的调用不明确,我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3883284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com