Причина, по которой оператор 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, здесь и здесь .