В OpenCL 1.1 мой вызов функции min () неоднозначен, и я не могу понять, почему

Я только что обновил 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) к int из uint (я считаю, что он возвращает uint) решит проблему, но это не так. Кто-нибудь знает, что происходит? Я посмотрел на спецификации 1.0 и 1.1 и до сих пор не понимаю, почему это происходит.


person smuggledPancakes    schedule 07.10.2010    source источник


Ответы (2)


Спецификации 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 (что несколько бесполезно указывает сообщение об ошибке компилятора), например.

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)

...
person grrussel    schedule 07.10.2010
comment
Я сделал, convert_int (get_global_id (2)). Это избавляет от ошибки, которую я писал ранее, но теперь я получаю ошибки сегментации. Может ли это быть связано с размером 32 или 64 бита? Я действительно заблудился ... - person smuggledPancakes; 07.10.2010
comment
Ошибка сегментации, вероятно, связана с неправильной индексацией в памяти или чтением / записью через указатели за пределами границ. Вызов convert_int, вероятно, является излишним по сравнению с приведением в стиле C. В исходном коде вопроса недостаточно контекста для более точной диагностики. - person grrussel; 07.10.2010
comment
Ошибка сегментации, похоже, исходит из несвязанной части моей программы. Я считаю, что эта проблема решена, и это просто вопрос того, как OpenCL 1.1 более строго относится к тому, как рассчитывался этот параметр. - person smuggledPancakes; 07.10.2010

Я действительно не знаю OpenCL, но похоже, что компилятор не знает, должен ли он продвигать аргументы min в double8 или double16. Поскольку эти типы являются векторами, а не скалярами, я полагаю, что min - не та функция, которую вы ищете. Вместо этого попробуйте fmin.

РЕДАКТИРОВАТЬ: Вы видите следующее в сообщениях об ошибках?

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

JAB В ТЕМНОМ: Транслируйте все на int:

int nFramesThisKernelIngests = (int) min(
    (int) (nFramesToIngest - nAvg * nPP * get_global_id(2)),
    (int) (nAvg * nPP));

Если это компилируется, удалите приведение в порядке убывания глупости (например, первое приведение, вероятно, бессмысленно, но YMMV).

person Frédéric Hamidi    schedule 07.10.2010
comment
Замечание о double8 и double16. Буквально 20 других строк вывода ошибок говорят то же самое, но с разными типами, такими как ushort, uint, float2, float4, float8, float16. - person smuggledPancakes; 07.10.2010
comment
Хорошо ... какие типы nFramesToIngest, nAvg и nPP? Каков тип результата get_global_id()? :) - person Frédéric Hamidi; 07.10.2010
comment
да, понимаю, ‹built-in›: 3435: 22: примечание: функция-кандидат int OVERLOADABLE min (int, int); - person smuggledPancakes; 07.10.2010