В OpenCL 1.1 мой вызов функции min () неоднозначен, и я не могу понять, почему - PullRequest
3 голосов
/ 07 октября 2010

Я только что обновился с 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 и все еще не понимаю, почему это происходит.

Ответы [ 2 ]

6 голосов
/ 07 октября 2010

Спецификации 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)

...
1 голос
/ 07 октября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...