Чем полезен оператор выбора OpenCL? - PullRequest
2 голосов
/ 27 мая 2020

Я заметил, что OpenCL имеет select() функцию / встроенный / оператор, который, кажется, похож на тернарный оператор в C и C ++, но не совсем. В чем разница между select() и ?: и почему первое даже требуется, если у нас есть второе?

1 Ответ

3 голосов
/ 27 мая 2020

Причина, по которой оператор select необходим / полезен, заключается в работе с OpenCL векторными типами , такими как int2, float4 et c. В отличие от C ++, где вы можете перегрузить различные операторы, чтобы дать им настраиваемую семантику - в C (и OpenCL C) есть только поведение по умолчанию. Для тернарного оператора это означает, что для

x ? expression_for_true : expression_for_false

будет выполнена проверка single , и будет использоваться единственное подходящее значение - даже если все три операнда принадлежат вектору OpenCL. тип.

Вместо этого с select():

  • Все элементы должны иметь те же размеры, что и векторные типы, например int4, float4 и float4.
  • a различная проверка выполняется для каждой позиции в векторном типе.
  • a различное выбор между элементами истинного и ложного выражений выполняется для каждого положение в векторном типе

Кроме того, чтобы немного запутать нас, порядок параметров в select() отличается от порядка в тернарном операторе: x ? y : z соответствует select(z, y, x).

Таким образом, если

x = (int4) ( 1, 0 );
y = (float4) ( 1.2, 3.4 );
z = (float4) ( 5.6, 7.8 );

, то

select(z, y, x) == (float4) ( 1.2, 7.8 );

См. Также документацию Khronos OpenCL, здесь и здесь .

...